[英]How to write this MySQL Query?
假设我们有一个表Users
,它只有一列UserId
,它是主键。
我们有第二个表Events
,它有三列, EventId
、 UserId
和Status
。 Status
是BOOL NOT NULL
。 UserId
已编入索引但不是唯一的。
表Status
在Users.UserId
上具有外键约束UserId
。
现在我想查询所有在Events
中没有行的UserId
,例如Event.Status = TRUE
。 有没有办法用JOIN
做到这一点? (只推荐一种说法)
例如:
Users
--------
1
2
3
Events
--------
EventId UserId Status
1 1 FALSE
2 1 TRUE
3 2 FALSE
4 2 FALSE
然后我正在寻找的查询应该返回:
UserId
-------
2
3
谢谢!
令人惊讶的是,子选择是在 MySQL 上执行此操作的一种相当有效的方法。 所以:
SELECT UserId
FROM Users
WHERE UserId NOT IN (
SELECT DISTINCT UserID
FROM Events
WHERE Status = TRUE
)
请注意,我在那里使用DISTINCT
,这可能不适合参考的文章。 请注意,您可以使用DISTINCT
或将其关闭(但我不知道这是否会导致临时数据集出现问题,或者 MySQL 是否对此很聪明)。
或者您可以执行不存在DISTINCT
问题的 LEFT JOIN / IS NULL 版本:
SELECT Users.UserId
FROM Users
LEFT JOIN Events
ON Events.UserId = Users.UserId AND Events.Status = TRUE
WHERE Events.UserId IS NULL
请参阅上面的链接进行讨论,但 MySQL 在两种情况下提供基本相同的性能(而使用NOT EXISTS
而不是NOT IN
会明显降低效率)。
我会尝试两者(或全部三个,如果您在第一个上同时尝试使用和不使用DISTINCT
),看看哪种方法最适合您的真实数据。
像这样的东西:
select UserId
from Users
where UserId not in (
select UserId
from Events
where Status = TRUE)
左连接:
select UserId
from Users usr
left join Events evt on
evt.UserId = usr.UserId and evt.Status = TRUE
where evt.UserId is null
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.