【发布时间】:2013-01-24 02:33:50
【问题描述】:
这里有很多类似的问题可以找到,但我认为没有人能充分回答这个问题。
我会从当前最流行的question 继续,如果可以的话,使用他们的例子。
本例中的任务是获取数据库中每个作者的最新帖子。
示例查询产生不可用的结果,因为它并不总是返回的最新帖子。
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 是该特定帖子的唯一标识符。
【问题讨论】:
-
正如您在给定答案的 cmets 中提到的,可能会有一些具有相同时间戳的帖子。如果是这样,请举例说明数据和预期结果。请描述一下,为什么你期望这个结果。
post_author和post_date不足以获得唯一的行,因此每个post_author必须有更多才能获得唯一的行 -
@SirRufo 你是对的,我已经为你添加了一个编辑。
-
There are plenty of similar questions to be found on here but I don't think that any answer the question adequately.这就是赏金的用途。 -
@LightnessRacesinOrbit,如果当前问题已经有一个我认为错误的公认答案,你会建议做什么?
-
想知道为什么您接受了使用子查询的答案 - 当您的问题明确提出时......““无论如何在分组之前对行进行排序而不诉诸子查询?”???
标签: mysql group-by sql-order-by