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
------------------------------------

Разве он не должен возвращать оба (или все)? Или я (возможно) ошибаюсь?

Author: Samik Sengupta, 2012-05-31

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 правильно выполняет операцию группировки, но (поскольку вы выбираете все столбцы, включая те, по которым вы не группируете запрос) дает вам неопределенную запись из каждой группы.

 13
Author: eggyal, 2012-05-31 09:18:17

Он возвращает только одну строку, потому что значения вашего столбца GROUP одинаковы... в основном так работает GROUP BY.

Кстати, при использовании GROUP BY рекомендуется использовать агрегатные функции для других столбцов, таких как COUNT(), MIN(), MAX(). В MySQL он обычно возвращает первую строку каждой группы, если вы просто укажете имена столбцов; однако другим базам данных это не понравится.

 2
Author: Ja͢ck, 2012-05-31 09:22:17

Ваш код:

SELECT * FROM forms GROUP BY 'GROUP'

Не очень "хороший" SQL, MySQL позволяет вам уйти от этого и возвращает только одно значение для всех столбцов, не упомянутых в предложении group by. Почти любая другая база данных не выполнила бы этот запрос. Как правило, любой столбец, который не является частью условия группировки, должен использоваться с агрегатной функцией.

 1
Author: Mithrandir, 2012-05-31 09:20:38

Что касается 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

 1
Author: user2865053, 2013-11-17 05:04:00
SELECT * FROM forms GROUP BY `GROUP` 

Странно, что ваш запрос действительно работает

 0
Author: triclosan, 2012-05-31 09:20:50

Приведенный выше результат отчасти верен, но не совсем.

Все выбранные вами столбцы, которые не являются частью инструкции GROUP BY, должны быть агрегированы некоторой функцией ( список функций агрегирования из документа MySQL ). Чаще всего они используются вместе с числовыми столбцами.

Кроме того, ваш запрос вернет одну выходную строку для каждой (комбинации) атрибутов в столбцах, на которые ссылается оператор GROUP BY. В вашем случае есть только одно отдельное значение в столбец GROUP, а именно "Некоторая группа", поэтому вывод будет содержать только одну строку для этого значения.

 0
Author: Sirko, 2012-05-31 09:21:57

Group by предложение должно быть обязательным только в том случае, если у вас есть какие-либо групповые функции, скажем max, min, avg, sum, и т.д., применяемые в выражениях запросов. Ваш запрос не показывает никаких таких функций. Это означает, что вам на самом деле не требуется предложение Group by. И если вы все еще используете такое предложение, вы получите только первую запись из сгруппированных результатов.

Следовательно, вывод по вашему запросу идеален.

 0
Author: Ravinder Reddy, 2012-05-31 09:22:17

Спасибо всем вам за то, что указали на очевидную ошибку, которую я был слишком слеп, чтобы увидеть. Я, наконец, заменил GROUP BY на ORDER BY и включил предложение WHERE, чтобы получить желаемый результат. Это то, что я собирался использовать все это время. Глупый я.

Мой последний запрос становится таким -

SELECT * FROM forms WHERE GROUP='SomeGroup' ORDER BY 'GROUP'
 0
Author: Samik Sengupta, 2012-05-31 09:31:52

Результат запроса идеален; он вернет только одну строку.

 0
Author: manurajhada, 2012-07-19 04:39:58