MySQL "GROUP BY" игнорирует порядок записи - PullRequest
0 голосов
/ 03 мая 2018

Мы только что перенесли базу данных с сервера MySQL 5.0 на сервер 5.5, и простые запросы вроде этого больше не работают, как ожидалось:

    SELECT * FROM (
        SELECT *
        FROM tblTable
        ORDER BY fldField ASC
    ) tmp
    GROUP BY fldField

Внутренний запрос по-прежнему возвращает правильно упорядоченный набор записей, но группа по больше не выбирает первую запись из этого набора.

Переключение порядка на DESC также не влияет, так что, предположительно, группа не переключилась на выбор последней записи.

Насколько я могу судить, group by фактически просто выбирает первую запись в соответствии с порядком их создания, а не с порядком фактического набора записей. Если это имеет смысл?

Я не могу найти какой-либо отчет об ошибке или заметку об этом, так что надеюсь, у кого-нибудь есть идеи, пожалуйста?

1 Ответ

0 голосов
/ 05 мая 2018

Оказывается, CentOS 7 поставляет MariaDB вместо MySQL, а MariaDB игнорирует предложение ORDER BY внутренних запросов, оставляя внешний запрос для обработки внутреннего набора результатов в виде неупорядоченной таблицы для повышения производительности.

Здесь есть два варианта. Или:

  • Добавьте оверлей выпуска MySQL Community и установите MySQL из него вместо установки из репозитория CentOS, как показано в одной из многих статей, подобных этой: https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-centos-7

  • Или измените внутренние запросы, у которых есть предложения ORDER BY, чтобы также было предложение LIMIT, которое заставляет MariaDB рассматривать набор результатов как упорядоченную таблицу. Э.Г.

    SELECT * FROM (
        SELECT *
        FROM tblTable
        ORDER BY fldField ASC
        LIMIT 10000000
    ) tmp
    GROUP BY fldField
    

Надеюсь, это сэкономит кому-то еще немного времени.

...