COUNT неожиданно группирует строки - PullRequest
0 голосов
/ 10 августа 2010

Таблица items отслеживает различные типы предметов, которые можно хранить на складе.

item_type  item_name  last_stock

   1         cake      2010-08-10
   2         fruit     2010-08-07
   3         soda      2010-08-07
   4         water     2010-08-09

Таблица individual_items отслеживает каждый конкретный элемент.

   id   item_type

    1          1 
    2          2        
    3          1           

Myзапрос в MySQL:

SELECT i.item_type, i.item_name, COUNT(j.id)
FROM items i
LEFT OUTER JOIN individual_items j
ON i.item_type = j.item_type
GROUP BY j.item_type

Однако, COUNT(j.id) не соответствует моему результату.Кажется, он группирует любые элементы, которые определены, но на самом деле не существуют.

item_type    item_name  COUNT(j.id)
    1           cake         2
    2           fruit        1
    3           soda         0   

Я думаю, что ожидаемая четвертая строка 4 water 0 не появляется, потому что COUNT() неправильно группирует несуществующие строкирезультат от LEFT OUTER JOIN.Как я могу это исправить?

Ответы [ 4 ]

3 голосов
/ 10 августа 2010

Вы должны сгруппировать по всем полям в вашем операторе SELECT, кроме полей в агрегативных функциях

SELECT i.item_type, i.item_name, COUNT(j.id)
FROM items i
LEFT OUTER JOIN individual_items j
ON i.item_type = j.item_type
GROUP BY i.item_type, i.item_name

обновление: я проверил на своем локальном сервере MySQL, код выше должен работать

1 голос
/ 10 августа 2010

Ваш пункт GROUP BY, вероятно, является виновником здесь.Вы группируете по таблице, которая может не содержать тип элемента, поэтому в случае типов элементов 3 и 4 j.item_type имеет значение NULL (тогда как i.item_type будет содержать ожидаемые значения).Проблема должна решиться сама, если вместо этого вы сгруппируете по типу item_type.

0 голосов
/ 10 августа 2010

Попробуйте

SELECT i.item_type, i.item_name, COUNT(j.id)
FROM items i
LEFT OUTER JOIN individual_items j
ON i.item_type = j.item_type
GROUP BY i.item_type,i.item_name
0 голосов
/ 10 августа 2010

Попробуйте использовать ПРАВИЛЬНОЕ СОЕДИНЕНИЕ.

...