MySQL 5.7 - Ошибка sql_mode = only_full_group_by

После обновления до MySQL 5.7.11 мы получаем ряд ошибок, связанных с sql_mode, включая only_full_group_by.

Исследования показывают, что мы можем отключить это, но, вероятно, было бы лучше знать, как достичь намеченной цели с помощью правильно структурированных операторов SQL.

Ошибка:

#1140 - In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'tblslideshow.slideImage'; this is incompatible with sql_mode=only_full_group_by

Запрос:

SELECT
   tblslideshow.slideImage,
   COUNT(tblslideshow.slideID) AS countVal
FROM
  tblslideshow
WHERE
  tblslideshow.parentID = 3424

Цель состоит в том, чтобы вернуть список значений, а также счетчик для всех возвращенных записей. Как лучше всего достичь этой цели без изменения MySQL my.ini? И почему это ошибка Group By, если мы даже не группируемся? Или группировка - часть правильного решения?

Ожидаемый результат должен быть:

slideImage        |      countVal

Image1.jpg        |      3

Image2.jpg        |      3 

Image3.jpg        |      3 

Обновлено: поскольку мы используем PHP и MySQLi, может быть разумнее исключить Count () и просто использовать «mysqli_num_rows»

Использование агрегатной функции (здесь COUNT) агрегирование является. Без GROUP BY получается одна строка. MySQL жалуется, что не знает, какой slideImage отображать в этой строке.

Thorsten Kettner 08.06.2018 00:23

Вам не хватает GROUP BY. Все ваши неагрегированные столбцы должны быть в GROUP BY.

Eric 08.06.2018 00:26

Вы совершенно правы. Это был дерьмовый запрос, и после проверки кода остальных страниц слайд-изображение больше нигде не использовалось. Функция count () могла бы существовать отдельно без столбца slideImage. @ D-Shih действительно произвел рабочий запрос для заявленной цели. И мы еще не готовы к MySQL 8.0.11.

Burndog 08.06.2018 00:29

Привет. Это часто задаваемые вопросы. Пожалуйста, всегда гуглите много ясных, кратких и конкретных версий / формулировок вашего вопроса / проблемы / цели с вашими конкретными строками / именами и без них и читайте много ответов. Добавьте в поисковые запросы релевантные ключевые слова, которые вы обнаружите. Если вы не нашли ответа, опубликуйте сообщение, используя поиск по одному из вариантов по заголовку и ключевым словам для тегов.

philipxy 08.06.2018 01:16
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
932
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы используете Агрегатная функция, вам нужно добавить неагрегированные столбцы в предложение Group by.

SELECT
   tblslideshow.slideImage,
   COUNT(tblslideshow.slideID) AS countVal
FROM
  tblslideshow
WHERE
  tblslideshow.parentID = 3424
Group by tblslideshow.slideImage

РЕДАКТИРОВАТЬ

Вы можете попробовать использовать подзапрос на select

SELECT t.slideImage,
(
    SELECT
       COUNT(tblslideshow.slideID) AS countVal
    FROM
      tblslideshow
    WHERE
      tblslideshow.parentID = 3424
) countVal
FROM tblslideshow t
WHERE t.parentID = 3424

К сожалению, это создает countVal для каждой записи как 1, а не цель общего количества всех записей, возвращенных из запроса.

Burndog 08.06.2018 00:06

Не могли бы вы предоставить образцы данных и ожидать результата?

D-Shih 08.06.2018 00:06

Приведен пример. countVal должен быть Count () или Sum всех извлеченных записей.

Burndog 08.06.2018 00:11

Вам нужен COUNT OVER, доступный начиная с MySQL 8.0:

SELECT
   tblslideshow.slideImage,
   COUNT(*) OVER () AS countVal
FROM
  tblslideshow
WHERE
  tblslideshow.parentID = 3424;

Это сохраняет отдельные строки и добавляет к ним совокупное значение.

Другие вопросы по теме