Вложенный оператор 'where in' в запросе - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть этот запрос SQL:


select sum(qty) as 'total' from `sales_flat_quote_item`
where item_id not in (
  select item_id from `sales_flat_quote_item_option`
  where item_id in (
    select item_id from `sales_flat_quote_item`
    where quote_id = 12670
  ) 
  and code = 'is_gift'
)
and quote_id = 12670 and parent_item_id is null

Моя задача - выполнить этот запрос с помощью предложения JOIN.Ну сам запрос довольно странный.sales_flat_quote_item используется как в запросе, так и в подзапросе.Это вызывает некоторые эффективные проблемы.

Я не эксперт по SQL, поэтому я вас спрашиваю.Я могу самостоятельно обрабатывать один вложенный select запросов, но я не знаю, что делать в этой ситуации.

Мы используем Mysql db engine v. 5.1


Я смог сделать это так:


select A.qty, A.item_id from `sales_flat_quote_item` as A 
where A.item_id not in 
(
    select B.item_id from 
    `sales_flat_quote_item_option` as B
    inner join `sales_flat_quote_item` as C
    on C.item_id = B.item_id
    where B.code = 'is_gift' and
    C.quote_id = 834
)
and A.quote_id = 834 and A.parent_item_id is null

Можно ли сделать это без использования каких-либо подзапросов?

1 Ответ

1 голос
/ 22 ноября 2010

Чтобы разобраться с этим, нужно работать изнутри. Выясните, что возвращает самый внутренний запрос, затем сопоставьте результат с предложением where, продолжайте, пока не достигнете вершины.

select item_id 
from `sales_flat_quote_item` 
where quote_id = 12670

Это дает вам список item_id, где quote_id равен 12670.

select item_id 
from `sales_flat_quote_item_option`
where item_id in (Previous Result Set)   
and code = 'is_gift'

Это дает вам список item_id, где item_id содержится в предыдущем списке И столбец кода = 'is_gift'

select sum(qty) as 'total' 
from `sales_flat_quote_item`     
where item_id not in (Previous Result Set) 
and quote_id = 12670 and parent_item_id is null  

Возвращает итоговую сумму поля qty и называет его «total», где item_id отсутствует в предыдущем наборе результатов AND, имеет quote_id 12670 и не имеет parent_item_id.

Этого должно быть достаточно для повторной обработки вашего запроса, но если у вас все еще будут проблемы, оставьте мне комментарий, и я посмотрю, смогу ли я переписать его, учитывая приведенную выше информацию (без таблиц).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...