MySQL GROUP BY возвращает только первую строку
У меня есть таблица с именем forms
со следующей структурой -
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
SomeGroup | SomeForm2 | SomePath2
------------------------------------
Я использую следующий запрос -
SELECT * FROM forms GROUP BY 'GROUP'
Он возвращает только первую строку -
GROUP | FORM | FILEPATH
====================================
SomeGroup | SomeForm1 | SomePath1
------------------------------------
Разве он не должен возвращать оба (или все)? Или я (возможно) ошибаюсь?
9 answers
Как в руководстве говорится:
В стандартном SQL запрос, содержащий предложение
GROUP BY
, не может ссылаться на неагрегированные столбцы в списке выбора, которые не названы в предложенииGROUP BY
. Например, этот запрос является незаконным в стандартном SQL, поскольку столбецname
в списке выбора не отображается вGROUP BY
:SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid;Чтобы запрос был законным, столбец
name
должен быть опущен из списка выбора или назван в предложенииGROUP BY
.MySQL расширяет использование
GROUP BY
, чтобы список выбора мог ссылаться на неагрегированные столбцы, не названные в предложенииGROUP BY
. Это означает, что предыдущий запрос является законным в MySQL. Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно в первую очередь, когда все значения в каждом неагрегированном столбце, не названном вGROUP BY
, одинаковы для каждой группы. Сервер может свободно выбирать любое значение из каждой группы, поэтому, если они не являются то же самое, выбранные значения неопределенны.
В вашем случае MySQL правильно выполняет операцию группировки, но (поскольку вы выбираете все столбцы, включая те, по которым вы не группируете запрос) дает вам неопределенную запись из каждой группы.
Он возвращает только одну строку, потому что значения вашего столбца GROUP
одинаковы... в основном так работает GROUP BY
.
Кстати, при использовании GROUP BY
рекомендуется использовать агрегатные функции для других столбцов, таких как COUNT()
, MIN()
, MAX()
. В MySQL он обычно возвращает первую строку каждой группы, если вы просто укажете имена столбцов; однако другим базам данных это не понравится.
Ваш код:
SELECT * FROM forms GROUP BY 'GROUP'
Не очень "хороший" SQL, MySQL позволяет вам уйти от этого и возвращает только одно значение для всех столбцов, не упомянутых в предложении group by. Почти любая другая база данных не выполнила бы этот запрос. Как правило, любой столбец, который не является частью условия группировки, должен использоваться с агрегатной функцией.
Что касается mysql, я только что решил свою проблему с помощью hit & trial.
У меня была та же проблема 10 минут назад. Я использовал оператор mysql примерно так:
SELECT * FROM forms GROUP BY 'ID'; // returns only one row
Однако использование оператора, подобного следующему, приведет к тому же результату:
SELECT ID FROM forms GROUP BY 'ID'; // returns only one row
Моим решением было следующее:
SELECT ID FROM forms GROUP BY ID; // returns more than one row (with one column of field "ID") grouped by ID
Или
SELECT * FROM forms GROUP BY ID; // returns more than one row (with columns of all fields) grouped by ID
Или
SELECT * FROM forms GROUP BY `ID`; // returns more than one row (with columns of all fields) grouped by ID
Урок: Не используйте точку с запятой, я полагаю, что он выполняет поиск типа строки с двоеточиями. Удалите двоеточия из имени столбца и его будет группироваться по его значению. Однако вы можете использовать обратные побеги, например. ID
SELECT * FROM forms GROUP BY `GROUP`
Странно, что ваш запрос действительно работает
Приведенный выше результат отчасти верен, но не совсем.
Все выбранные вами столбцы, которые не являются частью инструкции GROUP BY
, должны быть агрегированы некоторой функцией ( список функций агрегирования из документа MySQL ). Чаще всего они используются вместе с числовыми столбцами.
Кроме того, ваш запрос вернет одну выходную строку для каждой (комбинации) атрибутов в столбцах, на которые ссылается оператор GROUP BY
. В вашем случае есть только одно отдельное значение в столбец GROUP
, а именно "Некоторая группа", поэтому вывод будет содержать только одну строку для этого значения.
Group by
предложение должно быть обязательным только в том случае, если у вас есть какие-либо групповые функции, скажем max
, min
, avg
, sum
, и т.д., применяемые в выражениях запросов. Ваш запрос не показывает никаких таких функций. Это означает, что вам на самом деле не требуется предложение Group by
. И если вы все еще используете такое предложение, вы получите только первую запись из сгруппированных результатов.
Следовательно, вывод по вашему запросу идеален.
Спасибо всем вам за то, что указали на очевидную ошибку, которую я был слишком слеп, чтобы увидеть. Я, наконец, заменил GROUP BY
на ORDER BY
и включил предложение WHERE
, чтобы получить желаемый результат. Это то, что я собирался использовать все это время. Глупый я.
Мой последний запрос становится таким -
SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'
Результат запроса идеален; он вернет только одну строку.