2012-03-15 1 views
9

Я пытаюсь перечислить варианты продуктов с заказанными количествами, НО ТАКЖЕ показать варианты продуктов, в которых нет заказанного количества. Поэтому я подумал, что это будет так же просто, как выбор продуктов и выполнение левого соединения по порядку каждого продукта, где заказ является текущей версией.Mysql комбинация левой/внутренней комбинации не работает должным образом

Так я ожидал, как этот порядок операций:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
LEFT JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

но получает также величины где is_current не 1 Тогда я подумал, хорошо, я просто не могу сделать внутреннее соединение после того, как слева присоединитесь вот так:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

но тогда товары, которые еще не были заказаны, не указаны. Я ожидал, что они появятся, когда SUM (количество) будет NULL. Может ли кто-нибудь увидеть, где моя логика пошла не так? Спасибо! Скотт

ответ

4

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

Так что-то вроде следующего должно работать:

select p.productid, sum(po.quantity) 
from products p 
left outer join (select po.productid, po.quantity 
         from productorders po 
         inner join orders o on o.orderid = po.orderid and o.iscurrent = 1) po on po.productid = p.productid 
group by p.productid 
+0

имеет смысл, я попробую ... один с – scott

+0

Отлично, отлично работает! ! Именно то, что нужно. Спасибо! – scott

+0

Нет проблем. Вы были на правильном пути; просто нужен дополнительный шаг – kaj

0

Распределите ваш идентификатор продукта:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 
GROUP BY p.product_id 
+0

Спасибо за ответ, по-прежнему перечислены только продукты, у которых есть хотя бы количество заказанных из них (так отображается в таблице product_orders). – scott

+0

работает, если вы меняете обратно 'INNER JOIN' на' LEFT JOIN'? – Alp

+0

Да, тогда запрос работает, но я также получаю все величины для is_current! = '1' then (поэтому более старые версии того же порядка) – scott

18

Хотя ответ KAJ является правильным, это не обязательно является идеальным, поскольку MySQL имеет тенденцию пропустить использование индексов при использовании производных таблиц (суб-селекцию). По крайней мере, это мое понимание. Вы можете продолжать использовать методологию использования JOINS, если вы разместите стыки в круглых скобках:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN (`product_orders` po 
    INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1') 
ON p.product_id=po.product_id; 

Просто помните, что положение ON для LEFT JOIN потребности прийти после скобки. Надеюсь, это поможет!

+0

Извините, я не использую stackoverflow очень часто и не знаю, как поместить код в свой раздел. – Chosun

+0

Я иногда пересматриваю превосходный момент, который вы сделали относительно индексов и подвыборов. Хорошее объяснение. – mkralla11

+0

Спасибо! Я делаю все, что могу ... ха. – Chosun

Смежные вопросы