如何将 ORDER 应用于 GROUP BY

How to apply ORDER to GROUP BY

我有 article table,每个都有一个相关的类别(如果没有分类则为 NULL - 在这种情况下我对这些文章不感兴趣)。

我想从一个类别中获取 8 篇最新文章,每篇文章总是只有一篇文章用于一个类别(即永远不会有 2 篇文章来自同一类别)。

这个查询几乎可以工作:

SELECT article.id, article.title, category_container.title  FROM `article`
JOIN `category_container` ON category_container.id = article.category_id
WHERE `category_id` IS NOT NULL GROUP BY `category_id` ORDER BY article.created_at DESC LIMIT 8

问题是,ORDER 不起作用。我想要最新的,它returns我是最早的(id最小,但应该相反)。

那么,如何将 ORDER 应用于 GROUP BY?

你不知道。您的查询已损坏 - 在 MySQL 的最新版本中,您会正确地收到错误消息。

而是使用 过滤 方法来获取最新的行。这是一个使用相关子查询的方法:

SELECT a.id, a.title, cc.title
FROM article a JOIN
     category_container cc
     ON cc.id = a.category_id
WHERE a.created_at = (SELECT MAX(a2.created_at)
                      FROM article a2
                      WHERE a2.category_id = a.category_id
                     )
ORDER BY a.created_at DESC
LIMIT 8;

为了性能,您需要 article(category_id, created_at) 上的索引。

在较新的版本中,使用 ROW_NUMBER():

会更简单
SELECT a.id, a.title, cc.title
FROM (SELECT a.*,
             ROW_NUMBER() OVER (PARTITION BY a.category_id ORDER BY a.created_at DESC) as seqnum
      FROM article a
     ) a JOIN
     category_container cc
     ON cc.id = a.category_id
WHERE seqnum = 1;

鉴于您的查询运行没有错误,您可能使用的是旧版本的 MySQL,这将不起作用。