MySQL ORDER BY 和 GROUP BY

标签 mysql

当我使用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 以获取具有匹配 sCatcdate 的行。

类似这样的事情:

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/

相关文章:

mysql - SQL 存储过程抛出错误

java - 我需要了解如何从数据库中获取唯一的随机行

php表单间歇性传递变量

php - 从数据库向 URL 添加值

php - Laravel 4 - 迁移和外键问题

php - 使用 WordPress 发布元数据函​​数的 HTML 表单中的关联数组

mysql - 在外键中插入数据时出错?

mysql - 更改服务器系统变量mysql

php - AdoDB 函数不适用于 MySQL 查询中的 utf8 转换

mysql - Kubernetes:mysql pod 无法打开日志文件/var/log/pods/