при использовании SQL GROUP BY одна «группа» может иметь несколько разных значений - PullRequest
0 голосов
/ 11 января 2019

У меня есть таблица с двумя столбцами: test_name (текст), create_at (дата).

когда я использую этот кусок кода:

SELECT test_name, MONTH(created_at) AS Month, COUNT(created_at) AS Num_Completed_Tests
FROM complete_tests
GROUP BY Month;

У меня такой вопрос: у каждого месяца есть несколько разных test_name, но этот код не привел к ошибке.

добавить контент

когда я выполняю этот код, я получаю:

test_name   Month   Num_Completed_Tests
Delayed Cup Game    1   11068
Yawn Warm-up    2   9122
Yawn Warm-up    3

если я добавлю 'WHERE MONTH (creation_at) = 1' в код, я получу 'Delayed Cup Game' в первой строке;

если я добавлю в код 'WHERE MONTH (creation_at) = 2', я получу 'Yawn Warm-up' в первой строке;

Похоже, что система всегда выбирает test_name ПЕРВОЙ строки, я не знаю, является ли это правилом MySQL.

1 Ответ

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

это должно произойти для версии mysql до 5.7, но самая последняя версия должна вызывать ошибку ... для самых последних версий это поведение управляется установкой SQL_MODE ..

в любом случае для версии mysql, которая допускает это, является результатом для столбца, не включенного в функцию агрегации и не упомянутого непредсказуемо (возвращает случайное первое полученное значение)

Вы должны управлять этим, используя (поддельную) агрегированную функцию, если результат для этого столбца не важен.

SELECT min(test_name)
  , MONTH(created_at) AS Month
  , COUNT(created_at) AS Num_Completed_Tests
FROM complete_tests
GROUP BY Month;

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

SELECT test_name
  , MONTH(created_at) AS Month
  , COUNT(created_at) AS Num_Completed_Tests
FROM complete_tests
GROUP BY test_name, Month;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...