【发布时间】:2021-10-02 18:31:05
【问题描述】:
我有三个表:users、rooms、room_users。
用户可以有很多房间,房间也可以有很多用户,所以这是多对多的关系。
users表:
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | Christian | 19 |
| 2 | Ben | 36 |
| 3 | Robert | 52 |
| 4 | Monica | 25 |
| 5 | Alice | 26 |
| 6 | William | 18 |
+----+-----------+-----+
rooms表:
+----+----------+
| id | name |
+----+----------+
| 1 | College |
| 2 | Work |
| 3 | Football |
+----+----------+
还有代表用户和房间关系的room_users表:
+---------+---------+
| user_id | room_id |
+---------+---------+
| 1 | 1 |
| 1 | 3 |
| 2 | 2 |
| 4 | 1 |
| 5 | 2 |
| 6 | 1 |
| 6 | 3 |
+---------+---------+
所以,有了这些表,我们可以说:
- Christian(1) 属于 College(1) 和 Football(3) 房间。
- Ben(2) 属于 Work(2) 房间。
- Robert(3) 不属于任何房间。
- Monica(4) 属于 College(1) 房间。
- Alice(5) 属于 Work(2) 房间。
- William(1) 属于 College(1) 和 Football(3) 房间。
现在,如果我想找到属于 Football room 的用户 (id),我应该使用以下查询:
SELECT user_id FROM room_users WHERE room_id = 3
此查询的输出:
+---------+
| user_id |
+---------+
| 1 |
| 6 |
+---------+
这是正确的,只有 Christian(1) 和 William(3) 属于 Football room。
但是如何找到不属于足球室的用户呢? 在这种情况下,查询必须返回 2、3、4 和 5 个 ID。也就是说,除了第一个查询中的 ID 之外的所有 ID。
是否可以使用LEFT JOIN 来做到这一点?
据我所知,它比使用子查询更有效。
提前致谢!
编辑:
我找到了一个可以解决问题的查询,但是这个查询在大型数据库上非常慢:
SELECT users.id FROM users WHERE 0=(SELECT COUNT(*) FROM room_users WHERE user_id=users.id AND room_id=3);
【问题讨论】:
标签: sql left-join relational-database