我的一个表存储了用户浏览器中的UserAgent以及与之关联的相应UID以及其他一些数据。每次用户登录时都会发生这种情况。因此,每个用户将拥有许多条目。我试图查询此表,以根据质量找到一些独特的用户。
例如,我试图找到只使用过IE6且没有其他浏览器的用户。我到目前为止最接近的是通过这种方法:
select distinct (U.UID) from TABLE1 tb1
inner join TABLE1 tb2 on tb1.UID = tb2.UID
where tb1.UserAgent like '%MSIE 6.%'
and tb2.UserAgent like '%MSIE 6.%'
这似乎回复了使用IE6和任何其他浏览器的用户。我试图发现基本上与此相反。仅使用IE6和IE6的用户。我也尝试了下面的那个但是也没有用,因为这个用户的很大一部分有非IE6浏览器的其他条目。
select distinct (U.UID) from TABLE1 tb1
inner join TABLE1 tb2 on tb1.UID = tb2.UID
where tb1.UserAgent like '%MSIE 6.%'
and tb2.UserAgent not like '%MSIE 6.%'
我认为我走在正确的轨道上,但可能会离开这里。
TIA!
答案 0 :(得分:1)
选择没有任何其他用户代理的用户代理like '%MSIE 6.%'
的用户。内部查询返回未使用'%MSIE 6.%'
select distinct tb1.UID from TABLE1 tb1
where tb1.UserAgent like '%MSIE 6.%' and
NOT EXISTS ( select tb2.UID from TABLE1 tb2
where tb1.UID = tb2.UID AND
tb2.UserAgent not like '%MSIE 6.%' )
您甚至可以使用NOT IN
代替NOT EXISTS
tb1.UID NOT IN (...)
。{/ p>
select distinct tb1.UID from TABLE1 tb1
where tb1.UserAgent like '%MSIE 6.%' and
tb1.UID NOT IN ( select tb2.UID from TABLE1 tb2
where tb2.UserAgent not like '%MSIE 6.%' )
where子句条件tb1.UserAgent like '%MSIE 6.%' and
也可以在没有任何副作用的情况下被删除,因为NOT
和内部查询确保用户的代理匹配%MSIE 6.%
答案 1 :(得分:1)
select distinct (tb1.UID) from TABLE1 tb1
where not exists (
select 1
from TABLE1
where UID = tb1.UID and UserAgent not like '%MSIE 6.%'
)
答案 2 :(得分:0)
无需加入,比JOIN / NOT EXISTS快得多:
select UID
from TABLE1
group by UID
having max(case when UserAgent like '%MSIE 6.%' then 0 else 1 end) = 0