当我使用group by时,我对cdate的这个order有问题,该顺序不是最后一个创建日期,但我认为是随机的
SELECT vedio_files.ID vedio_files.mCat, vedio_files.sCat,vedio_files.smalltitle, vcategories.Name,vcategories2.Name as subcat
FROM vedio_files
INNER JOIN `vcategories` ON vedio_files.mCat = vcategories.ID
LEFT JOIN vcategories vcategories2 ON vedio_files.sCat = vcategories2.ID
GROUP BY vedio_files.sCat ORDER BY vedio_files.cdate DESC LIMIT 10
最佳答案
正确。
ORDER BY
最后应用。该操作是在 GROUP BY
折叠行之后进行的。
该行上的cdate
值不确定。该值来自组中的某些行,但不一定是最低的行。
由于 GROUP BY 的非标准扩展,MySQL 允许运行查询。 (其他关系数据库会抛出有关“SELECT列表中的非聚合表达式不在GROUP BY中”的错误。如果我们在sql_mode中包含ONLY_FULL_GROUP_BY
,我们可以让MySQL抛出错误。
此处记录的行为:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
<小时/>我们可以使用内联 View 来获取 vedio_files
中每个 sCat
的最小 cdate
,并将内联 View 返回的结果连接起来到 vedio_files
以获取具有匹配 sCat
和 cdate
的行。
类似这样的事情:
SELECT vf.ID
, vf.mCat
, vf.sCat
, vf.smalltitle
, vc.Name
, c2.Name AS subcat
FROM ( SELECT cd.sCat
, MIN(cd.cdate) AS min_cdate
FROM vedio_files cd
GROUP
BY cd.sCat
ORDER
BY MIN(cd.cdate) DESC
LIMIT 10
) mn
JOIN vedio_files vf
ON vf.sCat = mn.sCat
AND vf.cdate = mn.min_cdate
JOIN vcategories vc
ON vf.mCat = vc.ID
LEFT
JOIN vcategories c2
ON c2.ID = vf.sCat
ORDER
BY ...
<小时/>
如果 vedio_files
中有多于一行具有相同的 sCat 最小日期,则此查询将返回所有这些行。
关于MySQL ORDER BY 和 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50531831/