Count () и проблема с левым соединением - PullRequest
9 голосов
/ 13 февраля 2011

У меня проблема с запросом, который отображает список магазинов с количеством продуктов, связанных с ним. Я уже давно играю с левыми соединениями и т.д., но безрезультатно. Таблицы имеют следующую структуру:

Таблица магазинов, содержащая столбцы: id, name

Таблица продуктов, содержащая столбцы: id, name, status, shop

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

select s.name
       , p.name
       , count(p.id) 
from   Product as p 
       left join Shop as s on p.shop=s.id
where  p.status <> '8796107276379'
group by 
       s.id

Я не получаю магазины, в которых есть 0 товаров. Как мне этого добиться?

Основной базой данных является MySQL.

Спасибо! Krt_Malta

Ответы [ 4 ]

22 голосов
/ 13 февраля 2011

Вам нужен SHOP на левой стороне, так как правая сторона - та, которая может не иметь данных, в данном случае PRODUCT.

Мало того, вам нужно условие WHERE в качестве LEFT-JOIN ONусловие, так что оно присоединяется к продуктам в состоянии статуса и просто делает скидку на продукт (сохраняя магазин), даже если статус нежелателен.

select s.name
       , p.name
       , count(p.id) 
from   Shop as s
       left join Product as p on p.shop=s.id AND p.status <> '8796107276379'
group by 
       s.id, p.name
1 голос
/ 13 февраля 2011
select s.name
       , p.name
       , count(p.id) 
from   Shop as s 
       left join Product as p on s.id=p.shop
where  p.status <> '8796107276379'
group by 
       s.id
0 голосов
/ 03 апреля 2014

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

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

http://simpleritsolutions.com/sql/left/join/problems

0 голосов
/ 13 февраля 2011

Вам необходимо добавить OR p.status IS NULL к предложению where.

select s.name, p.name, count(p.id) 
from Shop s 
left join Product p on p.shop = s.id
where (p.status <> '8796107276379' OR p.status IS NULL) 
group by s.name, p.name
...