1

我的一张表存储了来自用户浏览器的 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.%'

我认为我走在正确的轨道上,但可能离这里很远。

蒂亚!

4

3 回答 3

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 EXISTSlike tb1.UID NOT IN (...)

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.%

于 2013-09-17T20:16:12.257 回答
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.%'
                 )
于 2013-09-17T20:16:57.167 回答
0

无需加入,比加入/不存在快得多:

select UID 
from TABLE1
group by UID
having max(case when UserAgent like '%MSIE 6.%' then 0 else 1 end) = 0
于 2013-09-17T20:40:28.283 回答