我有一张桌子
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 :(得分: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
的新行。这是最终聚合的基础。