У меня проблема с этим порядком с помощью 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
какие-либо предложения? Спасибо
Правильный.
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, этот запрос возвращает все эти строки.
vedio_files.ID vedio_files.mCat