如何将 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,这将不起作用。
我有 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,这将不起作用。