Поиск по нескольким таблицам PostgeSQL

Изображение rean1mator

Здравствуйте!
Подскажите пожалуйста, как сделать запрос, который проведёт поиск одного и того же значения по нескольким таблицам? Т.е. просто будет искать, в какой же из трёх таблиц найдётся заданное значение.

Задача, например, такая:
есть 3 таблицы пользователей, в каждой из них есть поле, например, id. Пользователь приходит на сайт и для доступа в определенную часть сайта ему необходимо ввести этот id. Пользователь вводит id в поле, а дальше запрос бежит последовательно по трём таблицам и ищет, в какой же из таблиц есть такой id.

Заранее благодарю!

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Разные есть способы. Можно

Разные есть способы.
Можно использовать INNER JOIN, можно UNION
А можно вообще сделать VIEW где будут все три таблицы и искать там.

Благодарность

Изображение rean1mator

Спасибо!
Буду копать в этих направлениях :)

Если можно, ещё маленький вопрос: что работает быстрее при работе в связке PHP+PostgeSQL, JOIN, UNION или несколько простых запросов?

На мой взгляд UNION, потому

На мой взгляд UNION, потому что позволяет обойтись одним запросом в отличие от нескольких простых. JOIN же всё-таки производит объединение таблиц, что тоже может оказаться не сильно нужным в вашем случае.

А вообще ситуация, описанная вами больше напоминает неправильное проектирование БД. Проще иметь ОДНУ таблицу пользователей,а информацию описывающую свойства пользователей (если они разные) уже раскидывать по таблицам.

Проектирование БД

Изображение rean1mator

На самом деле распределение пользователей на разные таблицы вызвано тем, что эти пользователи относятся к разным категориям и каждый пользователь имеет собственный набор сопровождающих его данных. Тем более что каждая категория составит примерно 10000 записей, а следовательно хочется составить максимально быстрый алгоритм поиска пользователя по трём подобным таблицам :)

Так я и говорю, вытащите

Так я и говорю, вытащите самих пользователей в отдельную таблицу, а сопровождающие данные в другие
Например, у всех пользователей есть как минимум три общие поля: id, username, password, тогда можно сделать таблицу

CREATE TABLE users_tbl (
id INTEGER PRIMARY KEY,
username VARCHAR(32) UNIQUE,
password VARCHAR(32));

а сопровождающие таблицы с набором своих атрибутов будут всегда иметь поле user_id указывающее на пользователя в таблице users_tbl:

CREATE TABLE user_category1_tbl (
...
user_id INTEGER NOT NULL REFERENCES users_tbl (id) ON DELETE CASCADE,
--
);
Такая штука с вынесением таблиц называется НОРМАЛИЗАЦИЯ

Причём, благодаря ON DELETE CASCADE, при удалении записи из таблицы user_category1_tbl будет удалена запись в таблице users_tbl с соответствующим id. Это называется ОГРАНИЧЕНИЯ ЦЕЛОСТНОСТИ.

Большое спасибо за

Изображение rean1mator

Большое спасибо за совет! :)
Попробуем данный способ использовать в контексте проекта

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023