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

MySQL关联user_event表查询特定用户事件的问题

嘿,我完全懂你现在的困扰——本来想关联user_event表只筛选用户1的事件,结果反倒拿到了所有不属于他的记录,这确实挺让人摸不着头脑的😅

先帮你捋清楚问题根源:你大概率是在关联user_event的时候用了反向条件(比如ue.user_id != 1),或者用了LEFT JOIN后错误地筛选了ue.user_id IS NULL,这就会把用户1关联的事件给排除掉了。

下面给你两种靠谱的正确写法,你可以根据自己的场景选:

方法1:用INNER JOIN直接关联筛选

这种方法最简单直接,INNER JOIN只会保留两边表匹配的记录,刚好符合你要的“只拿用户1的事件”需求:

SELECT 
    e.guid, 
    e.name, 
    COUNT(v.id) AS vote_count,
    RANK() OVER (ORDER BY COUNT(v.id) DESC) AS rank
FROM events e
INNER JOIN user_event ue 
    ON e.guid = ue.event_guid 
    AND ue.user_id = 1 -- 这里明确指定要筛选的用户ID
LEFT JOIN votes v 
    ON e.guid = v.event_guid
GROUP BY e.guid, e.name;

方法2:用WHERE EXISTS避免重复记录

如果user_event表中存在同一个用户多次关联同一个事件的情况(比如重复插入),用INNER JOIN可能会导致投票数被错误统计(因为重复行被计算多次),这时候用EXISTS更稳妥,它只检查存在性,不会引入重复行:

SELECT 
    e.guid, 
    e.name, 
    COUNT(v.id) AS vote_count,
    RANK() OVER (ORDER BY COUNT(v.id) DESC) AS rank
FROM events e
LEFT JOIN votes v 
    ON e.guid = v.event_guid
WHERE EXISTS (
    SELECT 1 
    FROM user_event ue 
    WHERE ue.event_guid = e.guid 
      AND ue.user_id = 1
)
GROUP BY e.guid, e.name;

另外补充一点:你用LEFT JOIN votes是对的,这样就算某个事件没有任何投票,vote_count也会显示为0;如果换成INNER JOIN votes,没有投票的事件就会被过滤掉,根据你的需求选就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:41:29