【问题标题】:How to use COUNT() with where in mysql?如何在mysql中的where中使用COUNT()?
【发布时间】:2021-01-06 22:22:57
【问题描述】:

我有表 pages (id, ...)page_visits (id, page_id, is_subscribed)

page_visits 表现在每个 page_id 大约有 200 万行。

我需要创建一个查询来获取每页的访问次数和订阅次数。我的查询现在只获取访问次数:

SELECT page_id, COUNT(page_id) AS visits
FROM `page_visits`
WHERE `page_id` in (1, 2)
GROUP BY `page_id`

但是如何在结果中添加一个page_subscriptions 列,该列将包含is_subscriped = 1 每一个page_id 的行数?

【问题讨论】:

    标签: mysql sql group-by count pivot


    【解决方案1】:

    count 忽略 nulls,因此您可以在 case 表达式上执行 count

    SELECT   page_id, 
             COUNT(page_id) AS visits 
             COUNT(CASE is_subscribed WHEN 1 THEN 1 END) AS subscried_visits
    FROM     page_visits
    WHERE    page_id IN (1, 2) 
    GROUP BY page_id
    

    【讨论】:

      【解决方案2】:

      只需使用count(*) 并按is_subscribed 分组...

      select `page_id`, count(*) as visits, `is_subscribed` from `page_visits` group by `page_id`, `is_subscribed`
      

      您将获得每页 2 行:

      1. 订阅人数统计
      2. 计算非订阅者

      count(*) 不会忽略空值

      【讨论】:

        【解决方案3】:

        我会推荐:

        select page_id, count(*) visits, sum(is_subscribed) page_subscriptions
        from page_visits
        where page_id in (1, 2)
        group by page_id
        

        理由:

        • 我希望page_id 不能为空;如果是这样,count(*)count(page_id) 更有效

        • is_subscribed 似乎正在存储0/1 值 - 因此计算1s 的数量相当于对列求和;这比条件计数更有效

        【讨论】:

          猜你喜欢
          • 2010-09-23
          • 2011-06-17
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          • 2019-07-12
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多