问题描述
我需要找到每个作者的最新帖子,然后分组结果,所以我只为每个作者一个最新的帖子。
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
编辑:
经过一些评论,我决定添加一些额外的信息。
我正在工作的公司也使用 Postgres,特别是 SQL Server 。此数据库不允许这样的查询。所以我知道还有一种方法来做到这一点 (我在下面写一个解决方案) 。如果您没有按投影中所处理的所有列进行分组,或者使用聚合函数,那么您也必须知道自己该做什么。否则让它成为!
我选择了上面的解决方案,因为这是一个具体的问题。汤姆想要在 wordpress 网站上获得每个作者的最近的帖子。在我看来,如果作者每秒钟做多个帖子,这个分析可以忽略不计。 WordPress 甚至应该禁止它的 spam-double-post 检测。我从个人经验中知道,通过 MySQL,这样一个肮脏的组织,表现有很大的好处。但是,如果你知道你做什么,那么你可以做到!我在专业负责的应用程序中有这么脏的组织。这里我有一些 mio 行的表需要 5-15s 而不是 100 ++秒。
有些利弊可能是有用的:http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html
SELECT
wp_posts.*
FROM
wp_posts
JOIN
(
SELECT
g.post_author
MAX(g.post_date) AS post_date
FROM wp_posts as g
WHERE
g.post_status='publish'
AND g.post_type='post'
GROUP BY g.post_author
) as t
ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date
ORDER BY wp_posts.post_date
但是如果这样一来,对于作者来说,这是一秒钟以上的一个帖子,你将获得超过一行而不是最后一行。
现在您可以再次旋转车轮,并获得最高 Id
的职位。即使在这里,至少不能保证你真的得到最后一个。
次佳解决方案
不知道我是否理解您的要求是正确的,但是内部声明获取每个作者最新的 post_date 列表,并将其与 wp_posts 表连接以获得完整的记录。
SELECT *
FROM wp_posts wp
INNER JOIN (
SELECT post_author
, MAX(post_date) AS post_date
FROM wp_posts
WHERE post_status = 'publish'
AND post_type = 'post'
GROUP BY
post.author
) wpmax ON wpmax.post_author = wp.post_author
AND wpmax.post_date = wp.post_date
ORDER BY
wp.post_date DESC
第三种解决方案
我认为 @edze 的回应是错的。
在 MySQL manual 中,您可以阅读:
MySQL extends the use of GROUP BY so that the select list can refer to nonaggregated columns not named in the GROUP BY clause. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values the server chooses.
两个伟大的参考:
抱歉,由于我的声誉,我无法评论 @edze 的回复,所以我写了一个新的答案。
第四种方案
在 ORDER BY 之后执行 GROUP BY,使用 GROUP BY 包装查询,如下所示:
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.author
第五种方案
如果您在 group-statement 之前或之后订购无关紧要,因为订单仅意味着 213 将转到 123 或 321 而不是更多。 group by 每列只需要几个条目,不仅是最新的。我认为你在这里使用 subselects
SELECT wp_posts.* FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
AND wp_posts.post_date = (Select max(post_date) from wp_posts where author = ... )
第六种方案
你怎么看待这件事??似乎为我工作
SELECT wp_posts.post_author, MAX(wp_posts.post_date), wp_posts.status, wp_posts.post_type
FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
它给我所有的作者最新的 post_date … 你确定一个问题吗?我不
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。