2012-08-20 1 views
1

У меня есть две таблицы в моей БД - продукты & заказы. Заказ может быть только одного вида продукта.sql - проблема с агрегацией

Вот основная идея:

enter image description here

То, что я пытаюсь сделать, это запрос, который дан copmany_id возвращает все продукты (от этой компании), которые имеют менее 10 заказов (в том числе 0)

мой запрос выглядит следующим образом:

SELECT p.* 
FROM product p, 
     order o 
WHERE p.company_id =? 
     AND o.product_id = p.id 
GROUP BY p.id 
HAVING Count(o.id) < 10 
ORDER BY p.id DESC 

запрос отлично работает для продуктов, которые имеют 0 < ORDE rs, но не возвращает числа с 0 порядками. Что мне нужно сделать, чтобы вернуть их?

ответ

1

Ваши две таблицы, что означает, что возвращаются только те продукты, для которых существует хотя бы один заказ. Вы должны LEFT OUTER JOIN Порядковый таблицу:

SELECT p.* 
FROM product p 
     LEFT OUTER JOIN order o 
        ON o.product_id = p.id 
WHERE p.company_id = ? 
GROUP BY p.id 
HAVING Count(o.id) < 10 
ORDER BY p.id DESC 

Левое внешнее соединение будет возвращать каждую запись на левой стороне JOIN операции, по крайней мере один раз, независимо от того, имеется соответствующая запись в право- с правой стороны операции JOIN.

1

попробовать левое внешнее соединение

SELECT p.* 
FROM product p 
     LEFT OUTER JOIN order o 
        ON o.product_id = p.id 
WHERE p.company_id =? 
GROUP BY p.id 
HAVING Count(o.id) < 10 
ORDER BY p.id DESC 

See this example for left outer join

+0

есть ли способ избежать объединения в этом случае? – levtatarov

+0

вы должны использовать join .. то, что вы использовали в своем запросе, также является объединением, но это внутреннее соединение –

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

  • Нет связанных вопросов^_^