MySQL упорядочить с группой по [дубликата]

0

У меня проблема с этим порядком с помощью cdate, когда я использую группу by, порядок не является последней датой создания, но я считаю случайным

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

какие-либо предложения? Спасибо

  • 0
    Это не имеет смысла: vedio_files.ID vedio_files.mCat
  • 0
    @Strawberry Клубника, вероятно, опечатка. пропущенная запятая.
Показать ещё 6 комментариев
Теги:
mysqli

1 ответ

1
Лучший ответ

Правильный.

ORDER BY применяется последним. Эта операция выполняется после того, как GROUP BY свертывает строки.

Значение cdate в строке является неопределенным. Значение из некоторой строки в группе, но это не обязательно самое низкое.

MySQL позволяет выполнить запрос из-за нестандартного расширения для GROUP BY. (Другие реляционные базы данных будут ONLY_FULL_GROUP_BY в отношении "неагрегатного выражения в списке SELECT, а не в GROUP BY". Мы можем заставить MySQL ONLY_FULL_GROUP_BY ошибку, если мы включим ONLY_FULL_GROUP_BY в sql_mode.

Поведенное здесь поведение: https://dev.mysql.com/doc/refman/5.7/ru/group-by-handling.html


Мы можем использовать встроенное представление для минимального cdate для каждого sCat в vedio_files и присоединить результаты от встроенного представления обратно к 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, этот запрос возвращает все эти строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню