簡體   English   中英

如果表B中沒有特定值的狀態,MySQL僅從表A返回用戶?

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

我有一個用戶表(表用戶)和一個日志表(表日志),其中包含有關該用戶的服務日志。 現在,我正在尋找一種方法來向我返回缺少日志中特定值的用戶列表。

讓我們看下面的例子:

  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

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僅需要每行獲得一個用戶(如果您要這樣做)的需求。

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匹配的那些日志條目)。 然后檢查狀態字段中是否存在“發送”一詞,這很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM