使用ORDER BY
在子查询中并不是解决这个问题的最佳方案。
获得的最佳解决方案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
然后,由于您要将其连接回表中,因此您将在这两个值上返回该帖子的完整详细信息。
See SQL 摆弄演示 http://www.sqlfiddle.com/#!2/b0645/2.
扩展我关于使用子查询来准确返回此数据的评论。
MySQL 不会强迫你GROUP BY
您包含在的每一列SELECT
列表。结果,如果你只GROUP BY
一列但总共返回 10 列,不能保证属于该列的其他列值post_author
被返回。如果该列不在GROUP BY
MySQL 选择应该返回什么值。
使用带有聚合函数的子查询将保证每次都返回正确的作者和帖子。
作为旁注,虽然 MySQL 允许您使用ORDER BY
在子查询中并允许您应用GROUP BY
并非每列SELECT
列出此行为在包括 SQL Server 在内的其他数据库中是不允许的。