2015-11-02 104 views
0

我运行以下MySQL查询: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 

以及如何修改该查询返回我只用只有两次访问用户相关的行?像这样:

visitnum userid 
2011  60264 
2012  60264 
+0

如果你在一件事情上的OUTER JOIN等于另一件事,而另外一件事与其他事情不相等,那些具有NULL结果的事件将只是你所追求的。 – Strawberry

+0

@Strawberry不完全确定你的意思。你能通过一个例子来提供更多的细节吗? – user2210021

回答

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 
) 
+0

谢谢,但这只会返回一行,像userid = 60264和 COUNT(*)= 2。我真正想要的是两行具有不同的visitnum值和相同的userid值,正如我在我的问题中提到的。有没有办法进一步修改你的查询来实现这一点? – user2210021

+0

@ user2210021有子查询应该可以工作。 – Luca

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)指数有。