MySQL 只有 return 来自 tableAU 的用户,如果表中没有特定的值状态?

MySQL only return user from tableA if no specific value status in tableB?

我有一个 table 用户(table 用户)和一个日志 table(table 日志),其中包含关于该用户的日志。现在我正在寻找一种方法来 return 我的用户列表,其中缺少日志中的特定值。

让我们举个例子:

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

以下加入return给我一个所有用户的列表和日志:

SELECT u.id, u.name, l.status
来自你的用户
LEFT JOIN 日志 l ON u.id = t.user_id</pre>

我怎样才能select只有那些没有状态'send'的?在这个例子中它应该只是 return id=3, user=user3.

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 是否有您想要的查询。如果子查询 return 没有行,则 NOT EXISTS 条件成立,并且该行是 returned.

编辑:

如果您只想查看 logs table 中哪些用户的状态不是 "send":

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 仅在每行获取一个用户的需要,如果这就是您想要做的全部。

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 匹配的那些日志条目)。然后检查状态字段是否缺少单词 'send'.

是一件简单的事情