Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Можно ли использовать во Where результат выбора


Автор: Alukard 29.5.2012, 16:40
Есть запрос вида:

Код

SELECT c.*, co.title as cotitle, 
( SELECT SUM( `amount` ) as amount FROM payment 
WHERE `type_payment` = 1 AND ( ( `type_document` = 3 AND `id_document` = c.ID ) OR ( `type_document` = 1 AND `id_document` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) ) ) as amount2, 
( SELECT SUM( qt * price ) as amount FROM invoice_composition WHERE `id_invoice` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) as exposed2 
FROM contract as c LEFT JOIN contractor as co ON(co.ID = c.id_contractor) 
WHERE 1 ORDER BY amount2



Такой вопрос, можно ли как то выбрать записи у которых amount2 >= exposed2 ? Запрос вида:
Код

SELECT c.*, co.title as cotitle,
( SELECT SUM( `amount` ) as amount FROM payment 
WHERE `type_payment` = 1 AND ( ( `type_document` = 3 AND `id_document` = c.ID ) OR ( `type_document` = 1 AND `id_document` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) ) ) as amount2, 
( SELECT SUM( qt * price ) as amount FROM invoice_composition WHERE `id_invoice` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) as exposed2 
FROM contract as c LEFT JOIN contractor as co ON(co.ID = c.id_contractor) 
WHERE amount2 >= exposed2 ORDER BY amount2


Выдает ошибку " Unknown column 'amount2' in 'where clause'" . 

Заранее спасибо.

Автор: Akina 29.5.2012, 19:36
Попробуй заменить where на having 

Автор: Zloxa 29.5.2012, 22:56
Код

select *
from (
SELECT c.*, co.title as cotitle,
( SELECT SUM( `amount` ) as amount FROM payment 
WHERE `type_payment` = 1 AND ( ( `type_document` = 3 AND `id_document` = c.ID ) OR ( `type_document` = 1 AND `id_document` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) ) ) as amount2, 
( SELECT SUM( qt * price ) as amount FROM invoice_composition WHERE `id_invoice` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) as exposed2 
FROM contract as c LEFT JOIN contractor as co ON(co.ID = c.id_contractor) 
) s
WHERE amount2 >= exposed2 ORDER BY amount2

Автор: tishaishii 30.5.2012, 06:24
...и избавиться от кучи вложенных запросов. Не знаю имеющуюся структуру БД.
Как правило, максимально приходится использовать только один уровень вложенности, какая бы сложная БД или данные, которые требуется получить, ни были - разбиваю по запросам.

Автор: Alukard 30.5.2012, 13:36
Цитата(Zloxa @ 29.5.2012,  23:56)
Код

select *
from (
SELECT c.*, co.title as cotitle,
( SELECT SUM( `amount` ) as amount FROM payment 
WHERE `type_payment` = 1 AND ( ( `type_document` = 3 AND `id_document` = c.ID ) OR ( `type_document` = 1 AND `id_document` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) ) ) as amount2, 
( SELECT SUM( qt * price ) as amount FROM invoice_composition WHERE `id_invoice` IN( SELECT id FROM invoice WHERE `id_contract` = c.ID ) ) as exposed2 
FROM contract as c LEFT JOIN contractor as co ON(co.ID = c.id_contractor) 
) s
WHERE amount2 >= exposed2 ORDER BY amount2

Спасибо! Действительно сработало. Очень благодарен, теперь буду знать, как делается выборка после выборки)))

Добавлено через 1 минуту и 52 секунды
Цитата(tishaishii @ 30.5.2012,  07:24)
...и избавиться от кучи вложенных запросов. Не знаю имеющуюся структуру БД.
Как правило, максимально приходится использовать только один уровень вложенности, какая бы сложная БД или данные, которые требуется получить, ни были - разбиваю по запросам.

Общение идет MySQL->PHP, и такой сложный запрос позволяет избежать множества циклов в PHP. К тому же запрос, единожды отправленный в MySQL из PHP выполнится быстрее, нежели много небольших запросов. К тому же запрос кешируется, и выполняться будет только при необходимости)

Автор: tishaishii 4.6.2012, 06:52
Цитата
К тому же запрос, единожды отправленный в MySQL из PHP выполнится быстрее, нежели много небольших запросов.

А это бабка надвое сказала. Зависит от оптимизатора MySQL. Один сложный запрос может выполниться гораздо медленнее, чем много простых.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)