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
相关产品推荐
相关产品推荐

