mysql - 根据一列的值计算过滤查询结果?

时间:2015-11-02 00:49:34

标签: mysql select count

我正在运行以下mysql查询:

SELECT visitnum, userid
FROM user_visit 
WHERE date >= '2015-10-31 00:00:00' AND date <= '2015-11-01 23:59:59'

其中返回以下结果:

visitnum   userid
2010       60265
2011       60264
2012       60264
2013       60268
2014       60269
2015       60269
2016       60269

如您所见,这意味着用户60265和60268有一次访问;用户60264有两次访问,用户60269有三次访问。

现在 - 我如何修改我的mysql查询,以便它只返回与仅访问ONCE的用户相关联的行?换句话说,我希望我的查询返回以下结果:

    visitnum   userid
    2010       60265
    2013       60268

如何修改查询以仅返回与仅访问TWICE的用户相关联的行?像这样:

 visitnum   userid
 2011       60264
 2012       60264

2 个答案:

答案 0 :(得分:2)

你可以使用这个技巧:

SELECT max(visitnum) as visitnum, userid
FROM user_visit 
WHERE date >= '2015-10-31 00:00:00' AND date <= '2015-11-01 23:59:59'
GROUP BY usserid
HAVING COUNT(*) = 1;

这里的诀窍是MAX(visitnum)是唯一的访问号码,当组中只有一行时。

不使用GROUP BY的替代方法是:

select uv.*
from user_visits uv
where not exists (select 1
                  from user_visits uv2
                  where uv2.userid = uv.userid and uv.visitnum <> uv2.visitnum
                 );

如果您拥有user_visits(userid, visitnum)的索引,那么这应该会有更好的表现。

答案 1 :(得分:1)

SELECT visitnum, userid
FROM user_visit
WHERE userid IN (
    SELECT userid
    FROM user_visit 
    WHERE date >= '2015-10-31 00:00:00' AND date <= '2015-11-01 23:59:59'
    GROUP BY userid
    HAVING COUNT(*) = 2
)
相关问题