SQL查询groupBy和filter

时间:2016-01-11 09:46:22

标签: mysql sql select pgadmin

我的数据库中有两个表,我需要加入这些表以获取用户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。

3 个答案:

答案 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'