2015-11-02 80 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)指數有。