MySQL连接 - 第二个表中没有数据

3
我有三张表,t1包含事件,t2包含“已参加”的事件,t3包含一些受邀用户ID(与系统用户ID关联)。一个事件可能有多个用户参加。
当创建新事件时,它会被插入到t1中。每次用户确认参加事件时,都会在t2中插入一行,否则t2表为空。
以下查询检索用户正在参加的所有事件。
SELECT * FROM events t1
INNER JOIN attending_events t2 ON t1.id_ev = t2.id_ev
INNER JOIN attending_users t3 ON t2.id_user = t3.id_user AND t3.id_system_user=17
WHERE t1.id_comp = 42

请帮忙,我需要一条查询语句来查找用户未参加的事件。


应该返回 id_comp <> 42 的事件吗? - Quassnoi
@Quassnoi:不,只有id_bcomp=42的事件应该被返回。 - noru
2个回答

3
SELECT  e.*
FROM    events e
WHERE   e.id_ev NOT IN
        (
        SELECT  id_ev
        FROM    attending_events ae
        JOIN    attending_users au
        ON      au.id_user = ae.id_user
        WHERE   au.system_user_id = 17
        )
        AND id_comp = 42

或者:

SELECT  *
FROM    events e
LEFT JOIN
(
        attending_events ae
JOIN    attending_users au
ON      au.id_user = ae.id_user
)
ON      ae.id_ev = e.id_ev
        AND au.system_user_id = 17
WHERE   e.id_comp = 42
        AND ae.id_ev IS NULL

谢谢!到目前为止,这是唯一可行的方法,如果我找不到更好的解决方案(不使用2个SELECT语句),我将继续使用它。 - noru
@noru:两个SELECT语句有什么不好的? - Quassnoi
@noru:使用Mithrandir的解决方案,它在MySQL中几乎具有相同的性能。 - Quassnoi
再次感谢,它非常有效!在这个简单的案例中,有10个事件和10个用户,我看到速度基本相同。 - noru
1
@noru:在MySQL中,它们几乎使用相同的计划:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ - Quassnoi
显示剩余2条评论

0
select * from attending_events where id_ev not in 
(SELECT id_ev FROM events t1
INNER JOIN attending_events t2 ON t1.id_ev = t2.id_ev
INNER JOIN attending_users t3 ON t2.id_user = t3.id_user AND t3.id_system_user=17
WHERE t1.id_comp = 42)

我脑海里浮现的第一件事。肯定应该被优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接