我们正在为学校开展一个项目,并且对查询提出了一个小问题。 我们尝试做的是:
选择具有相同education-unit(s)
的{{1}},之后选择最新version_vid
的{{1}}。
但无论我们尝试什么,最低education-unit
的{{1}}都会返回。
我们正在为这个项目使用Yii2框架,我们使用的ActiveQuery是:
version_date
SQL小提琴: http://sqlfiddle.com/#!9/9929d/2/0
提前致谢!
答案 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有一个执行计划如下:
答案 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