簡體   English   中英

SQL查詢分組並過濾

[英]SQL query groupBy and filter

我的數據庫中有兩個表,需要將它們連接起來以獲得用戶ID列表。 第一個表存儲user_idemail

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.

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