mysql返回count = 0没有使用group by连接

时间:2014-01-20 02:16:02

标签: mysql

我有一张桌子

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,我该如何获取行?

我所看到的所有问题都必须处理连接(通常是左连接),但由于这并不需要加入,因此我对如何解决此问题感到困惑。

1 个答案:

答案 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。无需ifcoalescecase声明。

这样做会创建UserIdSourceId的所有可能组合(基于Image表中的值)。然后使用left outer join连接回图像。这是做什么的?那么,对于现有记录,它实际上什么都不做。但对于未在表格中显示的组合,它会在其他字段中添加u.UserIds.SourceIdNULL的新行。这是最终聚合的基础。