MySQL在群组之前的顺序

我需要为每个作者find最新的post,然后对结果进行分组,以便每个作者只有一个最新的post。

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 

这是正确的分组输出,所以我只给每个作者一个post,但它是sorting后的结果分组,而不是在他们被选中之前。

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。 这个数据库不允许这样的查询。 所以我知道还有其他方法可以做到这一点(我在下面写一个解决scheme)。 如果不按投影中处理的所有列进行分组,或者使用聚合函数,则还必须知道自己做了什么。 否则,让它成为!

我select了上面的解决scheme,因为这是一个具体的问题。 汤姆想要得到WordPress的每个作者最近的post。 在我看来,如果一个作者每秒做一个以上的文章,分析是微不足道的。 WordPress的甚至应该禁止它的垃圾邮件双重检测。 我从个人经验中知道,使用MySQL做一个如此肮脏的团体在性能方面确实有很大的好处。 但是,如果你知道你做什么,那么你可以做到! 我在专业上负责的应用程序中有这样脏的组。 在这里,我有一些需要5-15s而不是100 ++秒的mio行的表格。

可能对一些利弊有用: 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的职位。 即使在这里,至less不能保证你真的得到最后一个。

不知道,如果我理解你的要求是正确的,但在内部语句获取每个作者的最新post_date的列表,并join到wp_posts表,以获得一个完整的logging。

 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手册中,您可以阅读:

MySQL扩展了GROUP BY的使用,以便select列表可以引用未在GROUP BY子句中命名的非聚集列。 通过避免不必要的列sorting和分组,您可以使用此function获得更好的性能。 但是,这非常有用,因为在GROUP BY中未命名的每个非聚合列中的所有值对于每个组都是相同的。 服务器可以自由select每个组的任何值,因此除非它们相同,否则所选的值是不确定的。 此外,每个组的值的select不能通过添加ORDER BY子句来影响。 结果集的sorting发生在select值之后,而ORDER BY不影响服务器select的值。

两个伟大的参考:

对不起,我不能评论@edze响应,因为我的名誉,所以我写了一个新的答案。

在ORDER BY之后通过用GROUP BY包装查询来执行GROUP BY,如下所示:

 SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.author 

如果你在团体陈述之前或之后订购,没关系,因为订单只意味着213到123或321,而不是更多。 通过每列只有一些条目,不仅是最新的。 我认为你在这里使用子查询

 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 …你在那里确定一个问题? 我不

  SELECT wp_posts.*,max(wp_posts.post_date) FROM wp_posts WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' GROUP BY wp_posts.post_author 

当我们的桌子变大时,表演也需要检查。 我在这里检查了所有问题的选项,其中带有136K消息的PM系统和83K行的链接表。

当你只需要计数,或只有身份证 – 亚历克斯的解决scheme是最好的。

 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 

当你需要其他领域时,我需要修改Husky110解决scheme(对于我的表格devise – 这里只是示例 – 没有选中),在我的表格中,比子查询选项快10倍:

 SELECT wp_posts.* FROM wp_posts, (Select post_id as pid, max(post_date) maxdate from wp_posts where author = ... group by author order by maxdate desc limit 4) t WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post' AND wp_posts.post_id = pid 

此更改可以select多个post(例如一个用户),并可以修改为其他解决scheme。

卡察夫。

使用下面的代码…

 <?php //get all users, iterate through users, query for one post for the user, //if there is a post then display the post title, author, content info $blogusers = get_users_of_blog(); if ($blogusers) { foreach ($blogusers as $bloguser) { $args = array( 'author' => $bloguser->user_id, 'showposts' => 1, 'caller_get_posts' => 1 ); $my_query = new WP_Query($args); if( $my_query->have_posts() ) { // $user = get_userdata($bloguser->user_id); // echo 'This is one post for author with User ID: ' . $user->ID . ' ' . $user- >user_firstname . ' ' . $user->user_lastname; while ($my_query->have_posts()) : $my_query->the_post(); ?> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <? php the_title_attribute(); ?>"><?php the_title(); ?></a> <small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?> </small><?php the_content(); endwhile; } } } ?> 

这里来自http://www.cafewebmaster.com/mysql-order-sort-group一个简单的答案;

 SELECT * FROM ( select * from `my_table` order by timestamp desc ) as my_table_tmp GROUP BY catid ORDER BY nid desc 

它为我创造了奇迹