如果表中没有特定的值状态,MySQL只从tableAU返回用户?

时间:2015-03-23 23:00:27

标签: mysql sql left-join

我有一个用户表(表用户)和一个日志表(表日志),其中包含有关用户的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

2 个答案:

答案 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匹配的日志条目)。然后检查状态字段是否存在“发送”一词是一件简单的事情。