为何MySQL含多COUNT语句的查询仅返回单个值?
解决画廊列表统计图片/视频数量只返回一行的问题
看起来你是因为没有对画廊进行分组查询,导致聚合函数把所有数据合并成了一行结果。结合你的表结构,我给你几个实用的解决方案:
方法一:用COUNT+CASE分组统计(通用所有SQL数据库)
这是最兼容的写法,不管你用MySQL、PostgreSQL还是SQL Server都能用:
SELECT g.id, g.title, -- 统计图片数量:只计数type为image的条目 COUNT(CASE WHEN gi.type = 'image' THEN 1 END) AS image_count, -- 统计视频数量:只计数type为video的条目 COUNT(CASE WHEN gi.type = 'video' THEN 1 END) AS video_count FROM galleries g -- 用LEFT JOIN保证空画廊也能显示(数量为0) LEFT JOIN gallery_items gi ON g.id = gi.gallery_id -- 关键:按画廊的id和标题分组,确保每个画廊一行结果 GROUP BY g.id, g.title;
方法二:用SUM+CASE实现同样效果
和上面逻辑一致,只是用SUM替代COUNT:
SELECT g.id, g.title, SUM(CASE WHEN gi.type = 'image' THEN 1 ELSE 0 END) AS image_count, SUM(CASE WHEN gi.type = 'video' THEN 1 ELSE 0 END) AS video_count FROM galleries g LEFT JOIN gallery_items gi ON g.id = gi.gallery_id GROUP BY g.id, g.title;
方法三:用FILTER子句(仅PostgreSQL等支持的数据库)
如果你的数据库支持FILTER语法,写法会更简洁:
SELECT g.id, g.title, COUNT(*) FILTER (WHERE gi.type = 'image') AS image_count, COUNT(*) FILTER (WHERE gi.type = 'video') AS video_count FROM galleries g LEFT JOIN gallery_items gi ON g.id = gi.gallery_id GROUP BY g.id, g.title;
为什么你之前只得到一行?
大概率是你的查询缺少了GROUP BY子句,比如直接写了类似这样的代码:
SELECT COUNT(CASE WHEN gi.type = 'image' THEN 1 END) AS image_count, COUNT(CASE WHEN gi.type = 'video' THEN 1 END) AS video_count FROM galleries g JOIN gallery_items gi ON g.id = gi.gallery_id;
没有分组的话,数据库会把所有数据当成一个整体来统计,自然只会返回一行汇总结果。
测试你的示例数据
用上面的正确查询,你的示例数据会得到如下结果:
| id | title | image_count | video_count |
|---|---|---|---|
| 1 | Simple gallery | 3 | 1 |
| 2 | Test gallery | 2 | 0 |
完全符合你要的每个画廊一行、展示对应数量的需求。
内容的提问来源于stack exchange,提问作者Војин Петровић
相关产品推荐
相关产品推荐

