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

编写SQL查询:按降序计算热门分类及分类关联问题数量

统计最受欢迎的分类(按关联问题数降序)

嘿,这事儿不难,我帮你捋清楚怎么写这个SQL查询!首先咱们得明确两个表的关联逻辑:一般Questions表会有个外键(比如category_id)关联Categories表的主键(比如id),咱们就是靠这个关联来统计每个分类下的问题数量。

基础版:只统计有问题的分类

如果你只想看那些至少有一个问题的分类,用INNER JOIN就够了,代码如下:

SELECT 
    c.id AS category_id,
    c.name AS category_name,
    COUNT(q.id) AS question_count
FROM 
    Categories c
INNER JOIN 
    Questions q ON c.id = q.category_id
GROUP BY 
    c.id, c.name
ORDER BY 
    question_count DESC;
  • INNER JOIN:只返回两边表都有匹配数据的行,也就是排除掉没有任何问题的分类
  • COUNT(q.id):统计每个分类下关联的问题数量(用q.id而不是*是为了避免把NULL值算进去,不过这里INNER JOIN不会有NULL,所以也可以用*,但前者更严谨)
  • GROUP BY:按分类的ID和名称分组,确保每个分类只返回一行统计结果
  • ORDER BY question_count DESC:按问题数量从多到少排序,也就是最受欢迎的分类排在最前面

进阶版:包含所有分类(哪怕没有问题)

如果你想把所有分类都列出来,包括那些还没有任何问题的(数量显示为0),那就用LEFT JOIN:

SELECT 
    c.id AS category_id,
    c.name AS category_name,
    COUNT(q.id) AS question_count
FROM 
    Categories c
LEFT JOIN 
    Questions q ON c.id = q.category_id
GROUP BY 
    c.id, c.name
ORDER BY 
    question_count DESC;

这里LEFT JOIN会返回Categories表的所有行,不管Questions表有没有匹配的记录。对于没有关联问题的分类,q.id会是NULL,而COUNT(q.id)会自动忽略NULL值,所以这类分类的question_count会显示为0。

额外小技巧:过滤掉无问题的分类

如果用了LEFT JOIN但又想排除掉问题数为0的分类,可以加个HAVING子句:

SELECT 
    c.id AS category_id,
    c.name AS category_name,
    COUNT(q.id) AS question_count
FROM 
    Categories c
LEFT JOIN 
    Questions q ON c.id = q.category_id
GROUP BY 
    c.id, c.name
HAVING 
    COUNT(q.id) > 0
ORDER BY 
    question_count DESC;

注意这里不能用WHERE,因为WHERE是在分组前过滤数据,而HAVING是在分组后过滤聚合结果。

最后提醒下:如果你的表字段名和我假设的不一样(比如外键叫cat_id,或者分类表叫Category),记得把代码里的字段名和表名替换成你实际使用的哦!

内容的提问来源于stack exchange,提问作者danplaton4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:13:21