Получении данных одним sql запросом [PHP][SQL]

Статус
В этой теме нельзя размещать новые ответы.
Полностью согласен. Если названия и типы столбцов всех таблиц одинаковы (хотя, если не изменяет память, при UNION названия и типы столбцов результсета определяются по первому SELECT'у), все должно работать. Названия столбцов во 2-м и 3-м SELECTах "причесываются" AS'ом. Типы - CAST'ом. Если в какой-то таблице недостает столбца - добавляется константа нужного типа.
Да но не забудте что нужно потом разбирать все эти данный что крайне будет не удобно!!!
Выход выполнить три запроса и не париться...
 
Один из возможных выходов - в каждый SELECT добавить фиктивное поле, чтоб при помощи него было можно легко разобраться. Каждый SELECT должен устанавливать свое значение данного поля, а имя поля у всех SELECT'ов - общее.
 
Дак тогда можно причем просто только нагрузка на больших таблицах будет велика!!!
 
В некоторых задачах это единственный выход. К тому же у UNION'ов есть замечательная особенность - они позволяют одним запросом реализовать как бы оператор if-then-else. То есть в зависимости от данных один и тот же запрос вытаскивает разные значения.
 
Всеравно этот запрос с использованием UNION будет выполняться долше чем три разных!!
 
Кто ж с этим спорит! :) Ясно что UNION выполнит все запросы, которые он соединяет. Просто иногда важнее не скорость или время выполнения запроса, а оставить всё в модели СУБД, не выносить логику "если так, то выбрать из таблицы t1, иначе выбрать из таблицы t2" в какой то отдельный скрипт. А сделав UNION, всегда можно быть уверенным, что выполнится заданный через UNION if-then-else. За это и приходится платить - в данном случае будет дольше, но универсальней.
 
pavel012007
а можно поподробнее о таком использовании UNION-ов?
никогда не сталкивался, покажите пример
 
Условие можно использовать и в простом запросе на скул сервере точно сам так делал..
не вижу смысла вытаскивать одним массивом данные из трех не связных таблиц..
Это даже с точки зрения бд не правильно.
Бд нужна для хранения структурированных данных а не издевательст.
пс.. Русские всегда пытаюца положить грязные носки в ящик с чистыми белыми рубашками!!!
 
pavel012007
а можно поподробнее о таком использовании UNION-ов?
никогда не сталкивался, покажите пример

Пусть нужно выполнить выборку из таблицы t1, если данные из таблицы t1 удовлетворяют некоторому "условию". И выборку из таблицы t2, если "условие" не выполняется. Общая схема такого запроса следующая:
Понятно, что если "условие" выполняется, выведутся записи t1, а если не выполняется - записи t2. "Условие" зависит от данных, которые содержатся в t1 и в t2, а так же как данные t1 и t2 в задаче связаны между собой.
Вот конкретный пример "условия" с использованием третьей таблицы ttt:
 
условия
Код:
t1.data IN (SELECT data FROM ttt)
и
Код:
t2.data NOT IN (SELECT data FROM ttt)
являются абсолютно разными и независимыми друг от друга.

Как результат в реальной "живой" БД, где в каждой из первых двух таблиц поле data может содержать значения, как совпадающие, так и отличные от
Код:
(SELECT data FROM ttt)
Так вот при таком запросе, вернутся данные из обоих таблиц, и я не вижу тут никакой аналогии с if...then...else

единственный способ сделать второй вопрос, зависимым от первого, как мне кажется это запрос вида:
Код:
(
SELECT * FROM t1
WHERE t1.data IN (SELECT data FROM ttt)
)
UNION ALL
(
SELECT * FROM t2
WHERE (SELECT COUNT(*) FROM t1 WHERE t1.data IN (SELECT data FROM ttt))>0
)
но такой запрос содержит повторяющийся подзапрос, который возможно не будет оптимизирован автоматически.
как вывод, этот запрос неприемлим в реальном приложении
PS если я неправильно понял, использование UNION как условия, попробуйте привести другой пример, потому что в этом UNION не сработает,как вы сказали.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху