校园建议应用:如何查询提交建议最多用户的所有相关条目?
查询提交建议数量最多的用户的所有相关条目
以下提供两种通用的SQL解决方案,适配不同的数据库环境:
方法一:子查询分步实现(兼容绝大多数SQL数据库)
这种写法无需依赖窗口函数,适用于所有支持基础SQL语法的数据库(如MySQL 5.x、SQLite等)。
实现逻辑
- 统计每个用户的建议提交数量,找出其中的最大值;
- 筛选出提交数量等于该最大值的所有用户ID;
- 关联用户表与建议表,获取这些用户的所有相关数据(用户信息+对应建议条目)。
完整SQL代码
SELECT u.*, s.* FROM users u INNER JOIN suggestions s ON u.userId = s.userId WHERE u.userId IN ( -- 筛选出提交建议数量最多的用户ID SELECT userId FROM suggestions GROUP BY userId HAVING COUNT(sugId) = ( -- 找出所有用户中最多的建议提交数 SELECT MAX(suggestion_count) FROM ( SELECT COUNT(sugId) AS suggestion_count FROM suggestions GROUP BY userId ) AS user_counts ) )
方法二:窗口函数实现(适用于支持窗口函数的数据库)
如果你的数据库支持窗口函数(如MySQL 8.0+、PostgreSQL、SQL Server等),可以用更简洁的写法,同时天然支持处理多个用户并列第一的场景。
实现逻辑
- 统计每个用户的建议提交数量;
- 对用户按提交数量降序排名;
- 筛选出排名为1的用户,关联获取他们的所有相关数据。
完整SQL代码
WITH user_suggestion_stats AS ( -- 统计每个用户的建议数量并排名 SELECT userId, COUNT(sugId) AS suggestion_count, RANK() OVER (ORDER BY COUNT(sugId) DESC) AS user_rank FROM suggestions GROUP BY userId ) SELECT u.*, s.* FROM users u INNER JOIN suggestions s ON u.userId = s.userId INNER JOIN user_suggestion_stats uss ON u.userId = uss.userId WHERE uss.user_rank = 1
补充说明
- 如果只需要获取建议条目,不需要用户表信息,可以移除
users u的关联部分,直接查询suggestions表中对应userId的记录; - 若希望仅返回一个用户(即使存在并列第一),可将
RANK()替换为ROW_NUMBER(),但通常保留所有并列用户更符合业务逻辑。
内容的提问来源于stack exchange,提问作者Raxxoht
相关产品推荐
相关产品推荐

