这里有很多类似的问题,但我认为没有人能充分回答这个问题.

我将从当前最受欢迎的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 

我的问题很简单:

Edit:这个问题是另一个问题的延续,我的具体情况略有不同.你可以(也应该)假设还有一个wp_帖子.id是该特定帖子的唯一标识符.

推荐答案

在子查询中使用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

然后,由于您要将其加入到表中,因此在这两个值上,您将返回该帖子的完整细节.

SQL Fiddle with Demo.

详细介绍我关于使用子查询准确返回此数据的 comments .

MySQL不会强迫您在SELECT列表中包含的每一列都输入GROUP BY.因此,如果只返回GROUP BY个一列,但总共返回10列,则无法保证属于返回的post_author列的其他列的值.如果列不在GROUP BY中,MySQL将 Select 应返回的值.

将子查询与聚合函数一起使用将确保每次返回正确的作者和帖子.

顺便说一句,虽然MySQL允许您在子查询中使用ORDER BY,并允许您对SELECT列表中的每一列应用GROUP BY,但在包括SQL Server在内的其他数据库中,这种行为是不允许的.

Mysql相关问答推荐

未知变量default-validation-plugin=mysql_native_passenger'

在SQL中,为什么:=即使条件为False,也会在case声明中执行?我如何修复这个问题?

筛选器中的Case When语句

在联合查询中使用GROUP BY和ORDER BY

对具有依赖子查询结果的2列使用等式比较来优化连接

MySQL中如何对字符串进行算术运算?

在带有 D.I 的 .NET AWS Lambda 中使用 MySql.Data

将 AVG 与 HAVING 结合使用

SQL:如何为给定组中的所有记录 Select 一列与另一列不匹配的位置

MySql,如何从列中替换某种格式的字符串

在分组结果 MySQL 5.7 版中获取最多的重复值

为什么 fetch 方法不能获取任何东西?(feat node.js,restAPI)

如何判断嵌套查询返回的元组中的每个条目是否相同?

MySQL计算特定值的列

如何为 php 启用 mysqlnd?

外键可以引用非唯一索引吗?

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取用户'root'@'localhost'的访问被拒绝(使用密码:YES)

MySQL:ALTER IGNORE TABLE 给出违反完整性约束

在 MySQL 中的子查询上使用 GROUP_CONCAT

MySQL:唯一字段需要是索引吗?