#mysql
#mysql
Вопрос:
У меня проблема, которую я действительно не понимаю. Запрос
SELECT
f.*,
ftv.content,
ftv.updated,
COUNT(ftv.file_number) AS versions
FROM
files as f
INNER JOIN
files_text_versions AS ftv
ON
ftv.file_number = f.file_number
WHERE
f.file_number = '%s'
ORDER BY
ftv.updated DESC
LIMIT 1
полностью игнорирует оператор ORDER BY, но если я удалю
COUNT(ftv.file_number) AS versions
запрос выполняется нормально и упорядочивается так, как должен.
Почему это так, и как мне это исправить?
SQL возится с той же проблемой, но только с одной таблицей:
Комментарии:
1. Что, если вы удалите ограничение? Кроме того, не могли бы вы поделиться структурой таблицы и некоторыми примерами данных? Вы должны создать скрипку здесь: sqlfiddle.com
2. агрегатная функция работает с предложением Group By.
3. @MatteoTassinari добавил sqlfiddle к вопросу, но здесь: sqlfiddle.com /#!2/c8f124/2
Ответ №1:
Ваш count(*)
запрос превращается в запрос агрегации. Без a group by
он просто возвращает одну строку. Хотя в других базах данных вы получите ошибку, MySQL допускает этот синтаксис.
Вы можете исправить это, добавив group by
. Однако затем у вас возникает проблема с двумя другими столбцами из ftv
. Вы можете получить нужные значения с помощью умной агрегации:
SELECT f.*,
substring_index(group_concat(ftv.content order by ftv.updated desc), ',', 1) as content,
MAX(ftv.updated) as updated,
COUNT(ftv.file_number) AS versions
FROM files f INNER JOIN
files_text_versions AS ftv
ON ftv.file_number = f.file_number
WHERE f.file_number = '%s'
GROUP BY t.file_number
ORDER BY updated DESC
LIMIT 1;