[英]SQL query groupBy and filter
我的數據庫中有兩個表,需要將它們連接起來以獲得用戶ID列表。 第一個表存儲user_id
和email
:
user_id | email
-------------------------
1 | test@test.com
2 | test2@test.com
表2包含用戶及其使用的瀏覽器的搜索:
id | user_id | browser
--------------------------------
1 | 1 | Internet Explorer
2 | 1 | Internet Explorer
3 | 1 | Firefox
4 | 2 | Chrome
我想基於user_id
將兩個表連接在一起,並過濾掉只使用過Internet Explorer的用戶。
我當前的查詢如下所示:
select distinct (u.id,u.email)
from users u join searches k on u.id = k.user_id
where k.browser = 'Internet Explorer'
這是錯誤的,因為這將檢索以前使用過Internet Explorer的用戶,但不僅限於Internet Explorer。
這將列出從非Internet Explorer的瀏覽器中至少進行一次搜索的所有用戶:
SELECT u.id, u.email
FROM users u
WHERE EXISTS (
SELECT 1
FROM searches s
WHERE s.user_id = u.id
AND s.browser <> 'Internet Explorer'
)
在每個用戶有時至少使用一個瀏覽器的假設下,可以通過過濾存在另一個瀏覽器的用戶來更輕松地完成此操作:
SELECT DISTINCT u.userid, u.email
FROM users u
WHERE EXISTS (SELECT *
FROM searches k
WHERE u.userid = k.userid AND k.browser != 'Internet Explorer')
如果此假設不正確,並且您還希望允許從未使用過任何瀏覽器的用戶使用,則還需要其他條件:
SELECT DISTINCT u.userid, u.email
FROM users u
WHERE EXISTS (SELECT *
FROM searches k
WHERE u.userid = k.userid AND k.browser != 'Internet Explorer')
OR NOT EXISTS (SELECT *
FROM searches k
WHERE u.userid = k.userid)
嘗試以下方法。
SELECT u.id , u.email
FROM users u
JOIN searches k ON u.id = k.user_i
GROUP BY u.Id , u.email
HAVING MIN(k.browser) = MAX(k.browser)
AND MAX(k.browser) = 'Internet Explorer'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.