You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何合并两个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

火山引擎 最新活动