ORDER BY在子查询中使用an 并不是解决此问题的最佳方法。
获得
max(post_date)作者身份的最佳解决方案是使用子查询返回最大日期,然后在最大日期和最大日期两者上将
post_author其联接到表中。
解决方案应该是:
SELECt p1.* FROM wp_posts p1INNER 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.MaxPostDateWHERe 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 | Author2/1/2013 | Jim
然后,由于您将其重新连接到表上,因此在这两个值上,您都将返回该帖子的完整详细信息。
请参阅带有演示的SQL Fiddle。
为了进一步说明我有关使用子查询准确返回此数据的评论。
MySQL不会强迫您进入列表中
GROUP BY包括的每一列
SELECT。因此,如果仅
GROUPBY一列但总共返回10列,则不能保证
post_author返回属于的其他列值。如果该列不在
GROUP BYMySQL中,则选择应返回的值。
将子查询与聚合函数一起使用将确保每次都返回正确的作者和帖子。
附带说明一下,虽然MySQL允许您
ORDER BY在子查询中使用,并允许您将不适用于列表中的
GROUPBY每个列,但
SELECT在其他数据库(包括SQL Server)中不允许这种行为。



