GROUP BY
группы MySQL GROUP BY
записывают записи, даже если они имеют разные значения.
Однако я бы хотел, чтобы это было как с DB2 SQL, так что если записи не содержат точно такой же информации, они не группируются.
В настоящее время в MySQL для:
id Name
Аманда
A Ana
Group by id
будет возвращать 1 запись случайным образом (если, конечно, не применяются условия агрегирования)
Однако в DB2 SQL одна и та же Group by id
не группирует их: возвращает 2 записи и никогда не делает так, чтобы случайно выбирать одно из значений при группировке без использования функций агрегации.
Во-первых, id
- это плохое имя для столбца, который не является первичным ключом таблицы. Но это не относится к вашему вопросу.
Этот запрос:
select id, name
from t
group by id;
возвращает ошибку почти в любой базе данных, кроме MySQL. Проблема в том, что name
не входит в group by
и не является аргументом функции агрегации. Ошибка - это стандартное поведение ANSI, которое не соблюдается MySQL.
Типичным способом написания запроса является:
select id, max(name)
from t
group by id;
Это должно работать во всех базах данных (при условии, что name
не является каким-то неясным типом, где max()
не работает).
Или, если вам нужно каждое имя, тогда:
select id, name
from t
group by id, name;
или проще:
select distinct id, name
from t;
В MySQL вы можете получить стандартное поведение ANSI, установив ONLY_FULL_GROUP_BY
для базы данных/сессии. Затем MySQL вернет ошибку, как это делает DB2 в этом случае.
Самые последние версии MySQL имеют ONLY_FULL_GROUP_BY
установленные по умолчанию.
Я не думаю, что есть автоматизированный способ сделать это, но используя
GROUP BY id, name
Дала бы вам решение, которое вы ищете
Группировка в mysql будет группировать записи в соответствии с установленными полями. Думайте об этом как: Он получает один, а другие не появятся. Например, он использует, чтобы подсчитать, сколько раз этот идентификатор повторяется в таблице:
select count(id), id from table group by id
Однако вы можете достичь своей цели, группировать по нескольким полям, что-то вроде строк:
select * from table group by id, name
GROUP BY
не включая все выбранные неагрегированные поля.