繁体   English   中英

如何编写这个 MySQL 查询?

[英]How to write this MySQL Query?

假设我们有一个表Users ,它只有一列UserId ,它是主键。

我们有第二个表Events ,它有三列, EventIdUserIdStatus StatusBOOL NOT NULL UserId已编入索引但不是唯一的。

StatusUsers.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM