mysql - 根据一列值的计数过滤查询结果?
我运行以下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
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
)
谢谢,但这只会返回一行,像userid = 60264和 COUNT(*)= 2。我真正想要的是两行具有不同的visitnum值和相同的userid值,正如我在我的问题中提到的。有没有办法进一步修改你的查询来实现这一点? – user2210021
@ user2210021有子查询应该可以工作。 – Luca
您可以使用这一招:
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)
指数有。
如果你在一件事情上的OUTER JOIN等于另一件事,而另外一件事与其他事情不相等,那些具有NULL结果的事件将只是你所追求的。 – Strawberry
@Strawberry不完全确定你的意思。你能通过一个例子来提供更多的细节吗? – user2210021