当前位置: 首页 > 知识库问答 >
问题:

MySQL排序依据前分组依据

乐华晖
2023-03-14

此实例中的任务是获取数据库中每个作者的最新文章。

示例查询产生不可用的结果,因为它并不总是返回的最新消息。

SELECT wp_posts.* FROM wp_posts
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    GROUP BY wp_posts.post_author           
    ORDER BY wp_posts.post_date DESC

目前公认的答案是

SELECT
    wp_posts.*
FROM wp_posts
WHERE
    wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
HAVING wp_posts.post_date = MAX(wp_posts.post_date) <- ONLY THE LAST POST FOR EACH AUTHOR
ORDER BY wp_posts.post_date DESC
SELECT wp_posts.* FROM 
(
    SELECT * 
    FROM wp_posts
    ORDER BY wp_posts.post_date DESC
) AS wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author 

编辑:这个问题是另一个问题的延续,我的具体情况略有不同。您可以(也应该)假设还有一个wp_posts.id是该特定帖子的唯一标识符。

共有1个答案

程阳平
2023-03-14

在子查询中使用order by并不是该问题的最佳解决方案。

按作者获取max(post_date)的最佳解决方案是使用子查询返回max date,然后将其连接到post_author和max date的表中。

解决办法应该是:

SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
    WHERE post_status='publish'
       AND post_type='post'
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
  AND p1.post_type='post'
order by p1.post_date desc
CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;
MaxPostDate | Author
2/1/2013    | Jim

请参见SQL Fiddle with演示。

来展开关于使用子查询准确返回此数据的注释。

MySQL不会强制您对选择列表中包含的每一列进行分组。因此,如果仅分组一列,但总共返回10列,则不能保证返回属于post_author的其他列值。如果列不在组中,,MySQL选择应该返回的值。

 类似资料:
  • 问题内容: 我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示: 该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。 例如,它可能返回: 当数据库中的记录是: 如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录? 问题答案: 一个简单的解决方案是将查询包裹与ORDER语句子选择 第一

  • 问题内容: 我有一张标签表,想从列表中获得计数最高的标签。 样本数据如下所示 使用 让我得到正在寻找的完美数据。但是,我想对它进行组织,以使最高的标签数排在首位,并限制它仅向我发送前20个左右。 我试过了 而且我不断收到“组功能的无效使用-ErrNr 1111” 我究竟做错了什么? 我正在使用MySQL 4.1.25-Debian 问题答案: 在所有版本的MySQL中,只需在SELECT列表中为聚

  • 问题内容: 在这里可以找到很多类似的问题,但是我认为没有一个人能够充分回答这个问题。 如果可以的话,我将继续从当前最受欢迎的问题开始,并使用其示例。 本例中的任务是获取数据库中每个作者的最新帖子。 该示例查询产生不可用的结果,因为它并不总是返回最新的帖子。 当前接受的答案是 不幸的是,这个答案是简单而简单的错误,并且在许多情况下产生的结果比原始查询更不稳定。 我最好的解决方案是使用形式的子查询 我

  • 我正在尝试使用Elasticsearch(2.4)聚合对使用该查询的多个索引按“productId”分组 1) 我想按分数排序,所以我尝试使用 哪个返回 2) 此外,我正在尝试使用分页,“size”键实际起作用,但“from”键不起作用 **更新-聚合结果示例** 希望有人能帮忙

  • 问题内容: 我正在MySQL 5.5中成功运行查询 但是,我需要使用DELETE运行相同的查询,但我不确定如何删除?即返回的结果应该删除? 有任何想法吗 ? 问题答案: 将其放在子查询中:

  • 问题内容: 我需要找到每个作者的最新帖子,然后对结果进行分组,所以我只为每个作者撰写一个最新帖子。 这样可以正确地对输出进行分组,因此每个作者只能得到一篇帖子,但是在对结果进行分组之后而不是在选择之前对结果进行排序。 问题答案: 编辑: 经过一番评论后,我决定添加一些其他信息。 我工作的公司也使用Postgres,尤其是SQL Server。该数据库不允许此类查询。因此,我知道还有另一种方法(我在