2014-01-20 2 views
0

У меня есть таблицаКоличество возврата MySQL = 0 без присоединяется с помощью группы по

Image 
| ImageId | UserId | SourceId | 
| 1  | 1  | 1  | 
| 2  | 1  | 2  | 
| 3  | 2  | 1  | 
| 4  | 2  | 2  | 
| 5  | 3  | 1  | 
| 6  | 3  | 1  | 
| 7  | 3  | 1  | 
| 8  | 3  | 1  | 
| 9  | 3  | 1  | 

Я тогда запрос:

SELECT UserId, IFNULL(COUNT(ImageId) , 0) AS ImageCount, SourceId 
FROM Image 
GROUP BY UserId, SourceId 

Когда я делаю запрос, я получаю

| UserId | SourceId | ImageCount 
| 1  | 1  | 1 
| 1  | 2  | 1 
| 2  | 1  | 1 
| 1  | 2  | 1 
| 3  | 1  | 5 

Тем не менее, одна строка, с которой я НЕ вернусь (я хочу):

| 3  | 1  | 0 

Как мне получить выборку строки, даже если счетчик равен 0?

Все вопросы, которые я видел, должны были иметь дело с объединениями (обычно слева объединены), но поскольку это не требует участия, я немного смущен относительно того, как это сделать.

+0

'UserId = 3 и SourceId = 1' уже агрегированы как счет 5 – xdazz

ответ

2

Для этого требуется left join и немного больше. Вы должны начать со всеми возможными комбинациями, а затем использовать left join внести в существующие значения:

SELECT u.UserId, COUNT(i.ImageId) AS ImageCount, s.SourceId 
FROM (select distinct UserId from Image) u cross join 
    (select distinct SourceId from Image) s left join 
    Image i 
    on i.UserId = u.UserId and i.SourceId = s.SourceId 
GROUP BY u.UserId, s.SourceId; 

count() вернется 0, если нет совпадений. Нет необходимости в заявлении if, coalesce или case.

Это делает возможной комбинацию UserId и SourceId (на основе значений в таблице Image). Затем он использует left outer join для подключения к изображению. Что это делает? Ну, для существующих записей это фактически ничего не делает. Но для комбинаций, которые не отображаются в таблице, он добавит новую строку с u.UserId, s.SourceId и NULL в другие поля. Это является основой для окончательной агрегации.

+0

Это абсолютно правильно, и я буду отмечать его как таков, когда таймер вверх. Однако вы можете немного глубже понять, как работает этот запрос, в частности, почему «select different» и «cross join»? –

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