SQL 查询 groupBy 和过滤器

SQL query groupBy and filter

我的数据库中有两个 table,我需要加入它们以获得用户 ID 列表。第一个 table 存储 user_idemail:

user_id | email
-------------------------
1       | test@test.com
2       | test2@test.com

Table 2 包含用户的搜索和他们使用的浏览器:

id | user_id | browser
--------------------------------
1  | 1       | Internet Explorer
2  | 1       | Internet Explorer
3  | 1       | Firefox
4  | 2       | Chrome

我想在user_id的基础上把两个table连在一起,过滤掉只用过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。

尝试以下方法。

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'

这将列出至少使用 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)