【问题标题】:Multiple GROUP BY to count MIN elements?多个 GROUP BY 来计算 MIN 元素?
【发布时间】:2020-08-19 14:02:37
【问题描述】:

假设在 MySQL 中我有一个表 comments,其中包含字段 post_id, author_id, datecomment

如果我想要每个帖子的第一条评论,我可以这样做

SELECT post_id, author_id, comment, MIN(date) AS comment_date 
FROM comments 
GROUP BY post_id;

如果我想得到制作cmet最多的作者,我可以做到

SELECT author_id, COUNT(*) AS total_comments 
FROM comments 
GROUP BY author_id 
ORDER BY total_comments DESC;

我想结合这些来回答“哪些作者制作了最多的第一个 cmets?”这个问题。我该怎么做?

【问题讨论】:

    标签: mysql sql group-by


    【解决方案1】:

    这是坏掉的 SQL:

    SELECT post_id, author_id, comment, MIN(date) AS comment_date 
    FROM comments 
    GROUP BY post_id;
    

    SELECT 列和GROUP BY 不一致。仅仅因为您的数据库恰好允许该语法并不意味着它可以执行您想要的操作。

    回答这个问题:

    “哪些作者制作的第一个 cmets 最多?”

    第一个查询的正确形式是:

    select c.*
    from comments c
    where c.date = (select min(c2.date)
                    from comments c2
                    where c2.post_id = c.post_id
                   );
    

    还有其他方法可以编写此逻辑,尤其是使用窗口函数。

    那么你只需要聚合:

    select author_id, count(*)
    from comments c
    where c.date = (select min(c2.date)
                    from comments c2
                    where c2.post_id = c.post_id
                   )
    group by author_id
    order by count(*) desc;
    

    注意:这假设最短日期确实对应于“第一条评论”,即使多个作者在同一日期制作 cmet。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 2013-02-16
      • 2013-04-06
      • 2012-07-25
      • 1970-01-01
      • 2020-11-02
      • 2020-12-29
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多