MySQL和MariaDB中使用GROUP BY和ORDER BY的不同结果集

MySQL和MariaDB中使用GROUP BY和ORDER BY的不同结果集,mysql,group-by,sql-order-by,mariadb,Mysql,Group By,Sql Order By,Mariadb,我有一个表格:voj_提交,结构如下: CREATE TABLE IF NOT EXISTS `voj_submissions` ( `submission_id` bigint(20) NOT NULL, `problem_id` bigint(20) NOT NULL, `uid` bigint(20) NOT NULL, `submission_judge_result` varchar(8) DEFAULT NULL, ) ENGINE=InnoDB AU

我有一个表格:voj_提交,结构如下:

CREATE TABLE IF NOT EXISTS `voj_submissions` (
    `submission_id` bigint(20) NOT NULL,
    `problem_id` bigint(20) NOT NULL,
    `uid` bigint(20) NOT NULL,
    `submission_judge_result` varchar(8) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=1004 DEFAULT CHARSET=utf8;
表中的数据可能如下所示:

SubmissionID ProblemID UserID JudgeResult
1000         1000      User1   AC
1001         1000      User1   WA
1002         1000      User2   CE
1003         1001      User1   AC
下面的SQL希望获得问题的最新判断结果:

SELECT submission_id, problem_id, submission_judge_result 
FROM (
    SELECT * FROM 
    voj_submissions 
    ORDER BY submission_id DESC 
) s 
WHERE uid = 'User1'
AND problem_id >= 1000
AND problem_id < 1010
GROUP BY problem_id
但在MariaDB 10.0.14中,它返回:

SubmissionID ProblemID JudgeResult
1000         1000      AC
1003         1001      AC
这意味着DESC的订单没有在MariaDB中执行。 我怎样才能解决这个问题

参考:

正如@bluefeet在本文中所说:

在子查询中使用ORDERBY并不是解决此问题的最佳方法

按作者获取maxpost_日期的最佳解决方案是使用子查询返回max date,然后将其连接到post_作者和max date的表中

因此,解决方案应该是:

SELECT submission_id, s1.problem_id, submission_judge_result
FROM voj_submissions  s1
INNER JOIN (
    SELECT MAX(submission_id) AS max_submission_id, problem_id
    FROM voj_submissions
    WHERE uid = 1000
    AND problem_id >= 1000
    AND problem_id < 1010
    GROUP BY problem_id
) s2 
ON s1.problem_id = s2.problem_id
AND s1.submission_id = s2.max_submission_id

这在MariaDB和MySQL中都可以使用。

当GROUP BY子句与GROUP BY中既没有聚合也没有引用的选定列结合使用时,结果是不确定的,不能依赖于此,也就是说,我从未见过这种黑客不起作用,所以-一个令人耳目一新的变化。无论如何现在来回答您的问题…中有两个最佳解决方案。这假设提交id是主要的,它应该是
SELECT submission_id, s1.problem_id, submission_judge_result
FROM voj_submissions  s1
INNER JOIN (
    SELECT MAX(submission_id) AS max_submission_id, problem_id
    FROM voj_submissions
    WHERE uid = 1000
    AND problem_id >= 1000
    AND problem_id < 1010
    GROUP BY problem_id
) s2 
ON s1.problem_id = s2.problem_id
AND s1.submission_id = s2.max_submission_id