Noi? Bez sensu dodawać imię i nazwisko w GROUP BY
skoro będą takie same dla tego samego id - zaciemnisz tylko intencje query. Poza tym, wszystko jedno jakiej funkcji agregującej użyjesz bo każdy input będzie taki sam, możesz wziąć FIRST()
, LAST()
, OVER()
zależnie od bazy.
-
Bez sensu
to odważnie powiedziane, zważywszy, że bez tych atrybutów w GROUP BY zapytanie na normalnej bazie po prostu nie zadziała ;-)
Tabelka z 2 kolumnami i danymi:
A | B
--+---
1 | X
1 | Y
2 | Z
2 | A
Co według Ciebie silnik ma zwrócić w takim przypadku GROUP BY
?
SELECT b from TABELKA GROUP BY a;
Silnikowi wszystko jedno czy logicznie A=ID, zaś B=Naziwsko, czy może logicznie A=Foo i B=Bar. Silnik wie po czym ma grupować, ale nie wie jaką wartość per grupa ma wziąć. Normalny silnik zwróci pewnie coś przewidywalnego typu 'nie umiem tego agregować', mniej normalny pewnie coś pierwszego z brzegu (na tych samych danych i dla tego samego zapytania różne wyniki - słabo).
W świecie MySQL takie zapytanie przejdzie, może to ukłon w kierunku ziomków ze świata PHP, który mają problemy z pisaniem joinów i group by? Nie wiem.
Dla porządku sprawdziłem i przechodzi na MySQL 5.5, ale już na MySQLu 8 poszli po rozum do głowy i naprawili:
https://www.db-fiddle.com/f/eC2e1gMcJEaA17TCy8oYLx/0
Query Error: Error: ER_WRONG_FIELD_WITH_GROUP: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.foo.imie' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
- Co do funkcji agregującej to pisałem, że takowa będzie potrzebna. Nie upieram się na konkretną, ale nie widzę potrzeby listowania wszystkich, które można wykorzystać w tym przypadku.
Reasumując, jak dla mnie nie jest to bez sensu, tylko poprawnie.