我有一个用户表(表用户)和一个日志表(表日志),其中包含有关用户的serval日志。现在我正在寻找一种方法来返回一个用户列表,其中缺少日志中的特定值。
让我们举例如下:
table users table logs
---------------- -----------------------------
| id | user | | id | user_id | status |
---------------- -----------------------------
| 1 | user1 | | 1 | 2 | send |
---------------- -----------------------------
| 2 | user2 | | 2 | 1 | send-error |
---------------- -----------------------------
| 3 | user3 | | 3 | 3 | status-x |
---------------- -----------------------------
| 4 | 1 | send |
-----------------------------
| 5 | 3 | send-error |
-----------------------------
以下联接返回所有用户的列表,并返回日志:
SELECT u.id, u.name, l.status
FROM users u
LEFT JOIN logs l ON u.id = t.user_id
如何只选择状态为“发送”的?在此示例中,它应该只返回 id = 3,user = user3 。
答案 0 :(得分:3)
SELECT u.id, u.name, l.status
FROM users u
LEFT JOIN logs l ON u.id = l.user_id
WHERE NOT EXISTS (SELECT 1 FROM logs g
WHERE u.id = g.user_id
AND g.status = 'send')
基本上,请查看NOT EXISTS
以查找您想要的查询。如果子查询不返回任何行,则NOT EXISTS
条件成立,并返回该行。
修改强>
如果您只想查看logs
表中哪些用户的状态为“发送”:
SELECT u.id, u.name
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM logs l
WHERE u.id = l.user_id
AND l.status = 'send')
此查询避免了GROUP BY
每行只需一个用户的需要,如果这就是你要做的全部。
答案 1 :(得分:0)
SELECT u.id, u.user, l.status
FROM users u
LEFT JOIN logs l ON u.id = l.user_id
WHERE l.status not like '%send%'
您已经在执行左连接(假设您希望所有用户和用户ID匹配的日志条目)。然后检查状态字段是否存在“发送”一词是一件简单的事情。