MySQL排序依据

在这里可以找到很多类似的问题,但是我认为没有一个人能够充分回答这个问题。

如果可以的话,我将继续从当前最受欢迎的问题开始,并使用其示例。

本例中的任务是获取数据库中每个作者的最新帖子。

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

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)中不允许这种行为。

以上是 MySQL排序依据 的全部内容, 来源链接: utcz.com/qa/415951.html

回到顶部