[英]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.