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

每个都是访问多个 DISTINCT 网页的用户

4

3 回答 3

36

只需添加有子句

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子句不能支持 where aggregated的列。

于 2013-03-06T02:12:13.143 回答
5

试试这个:

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

更多:拥有

于 2013-03-06T02:12:25.300 回答
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/版本的计划。)

于 2013-03-06T03:25:02.977 回答