You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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;

没有分组的话,数据库会把所有数据当成一个整体来统计,自然只会返回一行汇总结果。

测试你的示例数据

用上面的正确查询,你的示例数据会得到如下结果:

idtitleimage_countvideo_count
1Simple gallery31
2Test gallery20

完全符合你要的每个画廊一行、展示对应数量的需求。

内容的提问来源于stack exchange,提问作者Војин Петровић

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:33:28