SQL 查询 groupBy 和过滤器
SQL query groupBy and filter
我的数据库中有两个 table,我需要加入它们以获得用户 ID 列表。第一个 table 存储 user_id
和 email
:
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)
我的数据库中有两个 table,我需要加入它们以获得用户 ID 列表。第一个 table 存储 user_id
和 email
:
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)