mysql命令由group by

时间:2018-05-25 14:46:35

标签: mysql mysqli

当我使用group by时,cdte的这个顺序有问题,顺序不是最后一个创建日期,但我认为是随机的

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

有什么建议吗? 感谢

1 个答案:

答案 0 :(得分:1)

正确。

最后应用ORDER BYGROUP BY折叠行后,该操作为

行上cdate的值是不确定的。该值来自组中的某些行,但不一定是最低的。

MySQL允许查询运行,因为GROUP BY的非标准扩展。 (其他关系数据库会抛出“不在GROUP BY中的非聚合表达式”中的错误。如果我们在sql_mode中包含ONLY_FULL_GROUP_BY,我们可以让MySQL抛出错误。

此处记录的行为:docs

我们可以对cdate中的每个sCat使用内联视图至少vedio_files,并将内联视图中的结果连接回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的最小日期相同,则此查询将返回所有这些行。