在MySQL中选择具有多个不同记录的用户

17

对于一个保存用户网页访问行为记录的表,如何筛选出访问过多个网页的用户。

这个表的结构是:

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
 ...             ...

我该如何执行查询以获得最终结果,例如:

userId
  0
  2
 ...

每个用户访问了不止一个不同的网页

3个回答

36

只需添加 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子句不能支持聚合的列。


顺便问一下:在HAVING子句中我可以使用别名'count'吗? - Joey.Z
@zoujyjs 是的,HAVING 子句已经支持别名了... 在这里看看 http://sqlfiddle.com/#!2/049e0/4 - John Woo

5

试试这个:

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

More: HAVING


4

虽然在这种情况下使用HAVING是一个不错的方法,但请记住查询可以嵌套:

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

实际查询计划可能会有所不同,特别是如果HAVING是一个优化的情况,但没有理由必须使计划不同。(如果这是一个问题或者关注点,请在特定的RDBMS/版本上比较计划。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接