【发布时间】:2016-09-20 07:24:16
【问题描述】:
我的用户有很多帖子。我想构建一个 SQL 查询,该查询将在 1 个查询(无子查询)中执行以下操作,如果可能的话,希望没有联合。我知道我可以通过联合来做到这一点,但我想知道这是否可以只使用连接来完成。
我想获得一个不同的活跃用户列表:
- 没有帖子
- 没有已批准的帖子
这是我目前所拥有的:
SELECT DISTINCT u.*
FROM users u
LEFT JOIN posts p
ON p.user_id = u.id
LEFT JOIN posts p2
ON p2.user_id = u.id
WHERE u.status = 'active'
AND (p.status IS NULL
OR p2.status != 'approved');
问题是当用户有多个帖子并且其中一个处于活动状态时。这仍然会返回我不想要的用户。如果用户有一个活跃的帖子,他应该从结果集中删除。有什么想法吗?
数据如下所示:
mysql> select * from users;
+----+---------+
| id | status |
+----+---------+
| 1 | active |
| 2 | pending |
| 3 | pending |
| 4 | active |
| 5 | active |
+----+---------+
5 rows in set (0.00 sec)
mysql> select * from posts;
+----+---------+----------+
| id | user_id | status |
+----+---------+----------+
| 1 | 1 | approved |
| 2 | 1 | pending |
| 3 | 4 | pending |
+----+---------+----------+
3 rows in set (0.00 sec)
这里的答案应该只有用户 4 和 5。4 没有批准的帖子,5 没有帖子。它不应包含 1,它有一个已批准的帖子。
【问题讨论】:
-
你为什么要加入
users表和posts表的两个实例? -
第一次加入时,我试图让所有没有帖子的用户,在第二次加入时,我得到那些没有被批准的用户。这是错误的,因为这仍将包括拥有多个帖子且其中一个已获批准的用户。
-
“没有活跃的帖子” -> 你的意思是“没有批准的帖子”吗?
-
每张表有多少行? (巨大的表需要考虑缓存问题。)你有什么索引? (如果没有适当的索引,一些提供的答案会很慢。)
-
@ChrisSalzberg 谢谢,已修复。
标签: mysql sql database activerecord