时间:2015-05-20 12:12:45

标签: php mysql sql-order-by yii2 yii2-advanced-app

我们正在为学校开展一个项目,并且对查询提出了一个小问题。 我们尝试做的是:

选择具有相同education-unit(s)的{​​{1}},之后选择最新version_vid的{​​{1}}。 但无论我们尝试什么,最低education-unit的{​​{1}}都会返回。

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

version_date

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

提前致谢!

3 个答案:

答案 0 :(得分:0)

也许这可以帮到你:

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

答案 1 :(得分:-1)

在您的查询周围打包一个选择,然后执行以下操作:

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

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

  • FROM clause
  • WHERE子句
  • GROUP BY子句
  • HAVING条款
  • SELECT条款
  • ORDER BY子句

答案 2 :(得分:-1)

您获得最低euid的原因是ORDER BY之后应用了GROUP BY,而GROUP BY正在从该组中选择要返回的任意值。< / p>

这是群组问题中的经典顶级,并且一直是answered previously

我个人喜欢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