MySQL按日期排序结果在组by之后


MySQL order results by date after a group by

我们正在为学校做一个项目,在查询方面有一个小问题。我们要做的是:

先选择与version_vid相同的education-unit(s),再选择与version_date最新的education-unit。但是无论我们怎么做,euid最小的education-unit都会返回。

我们在这个项目中使用Yii2框架,我们使用的ActiveQuery是:

EducationUnit::find()->groupBy('version_vid')->orderBy('version_date DESC');

SQL小提琴:http://sqlfiddle.com/!9/9929d/2/0

提前感谢!

也许这能帮到你:

EducationUnit::find()
    ->from('select * from education_unit ORDER BY version_date DESC')
    ->groupBy('version_vid')
    ->all();

在查询语句周围加上select语句,然后按:

SELECT * FROM
( SELECT * FROM `education_unit` ORDER BY `version_date` DESC ) a
GROUP BY a.`version_vid`

为什么它不工作在你的查询是因为SQL有一个执行计划如下:

  • FROM子句
  • WHERE子句
  • GROUP BY子句
  • <
  • 有条款/gh>
  • SELECT子句
  • ORDER BY条款

您获得最低euid的原因是ORDER BYGROUP BY之后应用,GROUP BY从组中选择任意值返回。

这是一个经典的小组问题,以前已经回答过了

我个人喜欢Bill Karwin给出的答案,当它应用到你的情况时就变成了:

   SELECT t.*
     FROM table t
LEFT JOIN table t2
       ON t2.version_vid = t.version_vid 
      AND t2.version_date > t.version_date
    WHERE t2.version_vid IS NULL

另一个常见的解决方案是:

   SELECT t.*
     FROM table t
     JOIN (
       SELECT version_id, MAX(version_date) version_date
         FROM table
     GROUP BY version_id
          ) t2
       ON t2.version_id   = t1.version_id
      AND t2.version_date = t1.version_date