2013-03-06 103 views
13

對於包含用戶網頁訪問行爲記錄的表,如何選擇訪問多個網頁的用戶。選擇用戶在mysql中有多個不同記錄

此表的結構是:

userId  webpageId  visitTime 
    0    123   ... 
    0    124   ... 
    1    123   ... 
...    ...   ... 

我可以指望使用:

SELECT userId, COUNT(DISTINCT webpageId) AS count FROM visits GROUP BY userId; 

它給了我喜歡的結果:

userId   count 
    0    2 
    1    1 
    2    6 
...    ... 

我怎樣才能EXCUTE查詢給我最後的結果,如:

userId 
    0 
    2 
... 

每個是用戶在訪問多個不同的網頁

回答

23

只需添加having子句

SELECT userId, COUNT(DISTINCT webpageId) AS count 
FROM visits 
GROUP BY userId 
HAVING COUNT(DISTINCT webpageId) > 1 

,但如果你只是什麼ID

SELECT userId 
FROM visits 
GROUP BY userId 
HAVING COUNT(DISTINCT webpageId) > 1 

您之所以過濾HAVING子句而不是WHERE是因爲,WHERE子句不能支持哪些列在聚合

+0

到底!哪裏不適合GROUP,有! – zoujyjs 2013-03-06 02:15:16

+0

btw:我可以在HAVING子句中使用別名'count'嗎? – zoujyjs 2013-03-06 02:19:50

+0

@zoujyjs yes'HAVING'子句已經支持別名了。請看這裏http://sqlfiddle.com/#!2/049e0/4 – 2013-03-06 02:21:37

5

試試這個:

SELECT userId, COUNT(DISTINCT webpageId) AS count FROM visits GROUP BY userId 
having COUNT(DISTINCT webpageId) > 1 

更多:HAVING

+0

THX!這樣可行! – zoujyjs 2013-03-06 02:15:41

2

雖然HAVING在這種情況下,一個好辦法,請記住,查詢可以被嵌套:

SELECT userId, pageCount 
FROM (
    SELECT userId, COUNT(DISTINCT webpageId) AS pageCount 
    FROM visits 
    GROUP BY userId) AS n 
WHERE pageCount > 1 

的實際查詢計劃可能不同,特別是如果HAVING是一個優化案例,但沒有理由爲什麼計劃必須有所不同。 (比較關於特定RDBMS /版本的計劃,如果這是一個問題或擔心。)