Произошла ошибка базы данных Номер ошибки: 1055, сгруппировать по подстроке - PullRequest
0 голосов
/ 18 января 2019

Выражение # 1 из списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'shows.b.show_title', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

SELECT b.show_title as show_title FROM `shows` `b` 
WHERE `b`.`active` = 1 
GROUP BY SUBSTRING(show_title, 1, 1)

Я называю все столбцы в запросе выбора, так почему ошибка?

Мне известен обходной путь отключения ONLY_FULL_GROUP_BY из sql_mode, но как мне исправить ошибку с помощью запроса?

1 Ответ

0 голосов
/ 18 января 2019

В: почему ошибка?

Рассмотрим две строки со значениями show_title 'True Detective' и 'True Lies'

Выражение в GROUP BY будет возвращать T для обеих этих строк, поэтому эти строки будут объединены в одну строку в наборе результатов.

Запрос может возвращать только одно значение для столбца в свернутой строке, и оно не определено / неоднозначно, какое из двух значений вернуть. С ONLY_FULL_GROUP_BY в sql_mode MySQL более точно соответствует спецификации ANSI SQL; ошибка 1055 - это поведение, похожее на то, что мы наблюдаем в других реляционных СУБД, например Oracle, Microsoft SQL Server, Teradata, DB2 и др.


В: как решить ошибку с помощью запроса?

Нормативным шаблоном является использование агрегатной функции, чтобы указать, какое значение (из набора возможных значений) вернуть.

Например, MAX() или MIN(). Демонстрация:

SELECT SUBSTR(b.show_title,1,1)    AS s1 
     , MAX(b.show_title)           AS max_show_title
     , MIN(b.show_title)           AS min_show_title
  FROM shows b
 WHERE b.active = 1
 GROUP BY SUBSTR(b.show_title,1,1)

позволит избежать ошибки 1055 и может вернуть, например,

s1  max_show_title   min_show_title
--  ---------------  ---------------
T   True Lies        True Detective
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...