ВЫБОР КОЛИЧЕСТВА путается с ПОРЯДКОМ ПО

#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 возится с той же проблемой, но только с одной таблицей:

http://sqlfiddle.com /#!2/c8f124/2

Комментарии:

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;