2013-03-06 47 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 /版本的计划,如果这是一个问题或担心。)

相关问题