Выборка с условием, использующим данные из подзапросов в MySQL или вложенные Select(ы)

Выборка с условием, использующим данные из подзапросов в MySQL или вложенные Select(ы)

На одном из проектов необходимо было выполнить запрос вида:

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’ .

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

Следующий вариант уже не выдает никаких ошибок и корректно выбирает данные:

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

По сути, мы обернули наш запрос в ещё один Select, тем самым позволив MySQL работать с уже выбранными в предыдущем запросе данными.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *