当前位置: 首页 > 面试题库 >

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,它是该特定帖子的唯一标识符。


问题答案:

ORDER BY在子查询中使用an 并不是解决此问题的最佳方法

获得max(post_date)作者身份的最佳解决方案是使用子查询返回最大日期,然后在最大日期和最大日期两者上将post_author其联接到表中。

解决方案应该是:

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。

为了进一步说明我有关使用子查询准确返回此数据的评论。

MySQL不会强迫您进入列表中GROUP BY包括的每一列SELECT。因此,如果仅GROUP BY一列但总共返回10列,则不能保证post_author返回属于的其他列值。如果该列不在GROUP BYMySQL中,则选择应返回的值。

将子查询与聚合函数一起使用将确保每次都返回正确的作者和帖子。

附带说明一下,虽然MySQL允许您ORDER BY在子查询中使用,并允许您将不适用于列表中的GROUP BY每个列,但SELECT在其他数据库(包括SQL Server)中不允许这种行为。



 类似资料:
  • 此实例中的任务是获取数据库中每个作者的最新文章。 示例查询产生不可用的结果,因为它并不总是返回的最新消息。 目前公认的答案是 编辑:这个问题是另一个问题的延续,我的具体情况略有不同。您可以(也应该)假设还有一个wp_posts.id是该特定帖子的唯一标识符。

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

  • 我正在尝试优化这个查询,该查询通过字段(第1个)和字段(第2个)对进行排序。没有第一个字段查询需要大约0.250秒,但有了它需要大约2.500秒(意味着慢了10倍,可怕)。有什么建议吗? 注意: -使用InnoDB(MySQL 5.7.19) -主要是表上的 -字段同时被索引和 解释结果: 更新^^ 信誉规定:一个帖子,多少(n=信誉)天可以显示在列表的顶部。 实际上,我试图给一些帖子的声誉,可以

  • 问题内容: 感觉应该有一个基本的解决方案,但我似乎没有。 进行以下查询: 我想有效地做到这一点: 我并不是很想选择DatePublished,但是按它进行排序似乎很有意义。那是行不通的。 基本上,我想按最新的DatePublished文章对类别进行排序。 问题答案: 由于执行了,因此需要在非分组列上运行一些聚合函数。 将从每个类别中选择最后发表文章的日期,并相应地订购类别。

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

  • 问题内容: 我有一个名为Gift的表,该表与一个名为ClickThrough的表具有一对多关系- 该表指示单击了该特定Gift的次数。我需要查询所有的Gift对象,按ClickThrough计数排序。我不需要返回ClickThrough计数,因为我不需要做任何事情,我只想将其用于订购即可。 我需要查询以直接返回Gift对象的列表,只是按ClickThrough计数排序。如何使用Criteria A