我的数据库中有两个表,我需要加入这些表以获取用户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。
答案 0 :(得分:2)
这将列出从非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'
)
答案 1 :(得分:2)
假设每个用户有时使用至少一个浏览器,可以通过过滤存在其他浏览器的用户来更轻松地完成此操作:
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)
答案 2 :(得分:1)
请尝试以下操作。
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'