如何合并两个MySQL查询以获取特定用户事件及整体排名?
合并查询获取特定用户事件及其整体排名
嘿,我来帮你搞定这个MySQL查询合并的问题!要同时拿到特定用户的事件和这些事件在全局的投票排名,分两种情况来处理,看你用的MySQL版本:
方法一:MySQL 8.0+ 用窗口函数(推荐)
如果你的MySQL版本是8.0及以上,直接用RANK()或者DENSE_RANK()窗口函数就能轻松实现,代码简洁又高效:
SELECT ue.user_id, e.event_id, e.event_name, -- 替换成你Event表里的实际字段,比如标题之类的 e.votes, -- 按投票数降序计算全局排名,根据需求选RANK或DENSE_RANK RANK() OVER(ORDER BY e.votes DESC) AS overall_rank FROM Event e INNER JOIN User_Event ue ON e.event_id = ue.event_id WHERE ue.user_id IN ('user123', 'user456') -- 支持同时查询多个用户 ORDER BY ue.user_id, overall_rank;
小说明:
RANK():如果多个事件票数相同,会共享同一个排名,后续排名会跳过(比如两个第1名,下一个就是第3名)DENSE_RANK():相同票数的事件排名相同,后续排名连续(两个第1名,下一个是第2名)- 用
INNER JOIN只会返回用户关联过的事件,如果想保留用户所有记录(哪怕没关联事件),可以改成LEFT JOIN
方法二:MySQL 5.x 版本(无窗口函数)
如果你的MySQL版本比较旧,不支持窗口函数,就用子查询来计算排名:
SELECT ue.user_id, e.event_id, e.event_name, e.votes, -- 计算全局排名(这里是DENSE_RANK逻辑,要RANK的话改COUNT(*)) ( SELECT COUNT(DISTINCT votes) + 1 FROM Event WHERE votes > e.votes ) AS overall_rank FROM Event e INNER JOIN User_Event ue ON e.event_id = ue.event_id WHERE ue.user_id IN ('user123', 'user456') ORDER BY ue.user_id, overall_rank;
子查询逻辑:
- 对于当前事件,统计所有票数比它高的不同票数的数量,加1就是它的全局排名(这是连续排名的逻辑)
- 如果要实现
RANK()的跳过排名效果,把COUNT(DISTINCT votes)改成COUNT(*),统计所有票数比它高的事件总数
这样不管是查user123还是user456,或者同时查两个,都能一次性拿到用户的事件列表和每个事件的全局投票排名啦!
内容的提问来源于stack exchange,提问作者Shh




