【问题标题】:select users have more than one distinct records in mysql选择用户在mysql中有多个不同的记录
【发布时间】:2013-02-20 16:14:42
【问题描述】:

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

这个表的结构是:

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 网页的用户

【问题讨论】:

    标签: mysql sql select


    【解决方案1】:

    只需添加有子句

    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' 吗?
    • @zoujyjs 是的HAVING 子句已经支持别名.. 见这里sqlfiddle.com/#!2/049e0/4
    【解决方案2】:

    试试这个:

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

    更多:HAVING

    【讨论】:

      【解决方案3】:

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

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

      实际的查询计划可能会有所不同,特别是如果HAVING 是一个优化案例,但没有理由为什么计划必须有所不同。 (如果有问题或担忧,请比较特定 RDBMS/版本的计划。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2017-03-15
        相关资源
        最近更新 更多