【问题标题】:MySQL only return user from tableA if no specific value status in tableB?如果表中没有特定的值状态,MySQL 仅从 tableAU 返回用户?
【发布时间】:2015-03-23 23:00:26
【问题描述】:

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

让我们举个例子:

  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

【问题讨论】:

    标签: mysql sql left-join


    【解决方案1】:
    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 只是为了每行获取一个用户,如果您只想这样做的话。

    【讨论】:

    • 很酷的作品,如果我添加一个 GROUP BY u.id 我只会得到一个用户返回(如果有一个用户的多个日志)...跨度>
    • @user189996 如果这是您想要的,还有一个更简单的查询。在这种情况下,您不需要LEFT JOIN。我会编辑答案给你看。
    【解决方案2】:
    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 匹配的日志条目)。然后检查状态字段是否缺少“发送”一词是一件简单的事情。

    【讨论】:

      猜你喜欢
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 2022-12-16
      • 1970-01-01
      • 2011-12-08
      • 2016-10-07
      • 2016-03-28
      相关资源
      最近更新 更多