Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

GROUP BY bug i resenje

[es] :: MySQL :: GROUP BY bug i resenje

[ Pregleda: 2466 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Zmaj
Predrag Krstić
web developer
Zrenjanin

Član broj: 1035
Poruke: 382

Sajt: https://pkrstic.wordpress..


+4 Profil

icon GROUP BY bug i resenje20.04.2007. u 23:42 - pre 206 meseci
praveci upit nad tabelom naisao sam na problem sa GROUP BY
Code:

a : b : c
--------
1 : 1 : 3
1 : 4 : 7
2 : 5 : 4
2 : 6 : 8
3 : 9 : 7
3 : 2 : 6


ovo je otprilike izgled tabele, a upit je izgledao ovako
Code:

SELECT 
  a, 
  b, 
  MAX(c)
FROM
  table
GROUP BY
  a
ORDER BY
  a, b DESC


ono sto je ocekivano od ovog upita bi trebalo da izgleda ovako
Code:

a : b : c
--------
1 : 4 : 7
2 : 6 : 8
3 : 9 : 7


ali rezultat koji sam dobijao je izgledao ovako, tj nije povezivao b sa max(c) nego je rezultat prvo grupisao i onda izbacivao max za tu grupu i pored postojanja order klauzule
Code:

a : b : c
--------
1 : 1 : 7
2 : 5 : 8
3 : 9 : 7


Problem se ispoljavao prilkom izvrsavanja ovog upita iz php koda, dok se nije manifestovao iz phpMyAdmina, i ono sto sam primetio da je jedina razlika i izmedju mog upita i onog koji koristi pMA je to sto na kraju svakog upita dodaje LIMIT 0, 30 po defaultu.

Tako dodavsi LIMIT 10 se problem resio, ovo je ocigledan bug vezan za GROUP BY i s obzirom koliko me je namucio, da ne pricam koliko sam ljudi angazovao za resavanje ovog problema, i koliko sam raznih resenja dobio, resio sam da ovo podelim sa ljudima na forumu, da se ne bi patili ko ja.

Ovaj problem je registrovan i na zvanicnom sajtu MySQL-a ali su odgovorili da je to ocekivano ponasanje, a kao sto se vidi to nije regularno.
 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.dialup.neobee.net.



+41 Profil

icon Re: GROUP BY bug i resenje20.04.2007. u 23:48 - pre 206 meseci
Nije u pitanju bug vec su tvoja ocekivanja bila pogresna.

Probaj:

Code:

SELECT 
  a, 
  MAX(b), 
  MAX(c)
FROM
  table
GROUP BY
  a
 
Odgovor na temu

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
*.dialup.neobee.net.



Profil

icon Re: GROUP BY bug i resenje21.04.2007. u 00:56 - pre 206 meseci
@goranvuc

tvoje resenje daje izlaz kakav covek ocekuje, ali to je samo slucajni splet okolnosti, zbog rasporeda vrednosti b koloni.


 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.dialup.neobee.net.



+41 Profil

icon Re: GROUP BY bug i resenje21.04.2007. u 07:35 - pre 206 meseci
Pa mozda nije bas najjasnije objasnjeno kakva su to ocekivanja, ili ja nisam razumeo.

Inace, ova mi varijanta nije bas bliska, jer bi u svim "normalnim" RDBM sistemima tesko proslo da u SELECT delu navedes nesto sto nisi stavio u GROUP BY klauzulu, a da nije na njemu neka agregatna funkcija (MAX, MIN, SUM ...) tako da je pitanje sta su uopste autori MySql -a zamislili da se vrati u ovakvim slucajevima, kad su vec dozvolili ovakvu konstrukciju.

Dakle, u agregatnom upitu imas nesto po cemu grupises i nesto sto "agregiras", i na bilo kom setu podataka uvek mogu da ti kazem peske kako ce izgledati rezultat, a ovde ...
 
Odgovor na temu

goranvuc
Goran Vucicevic
Novi Sad

Član broj: 4934
Poruke: 1846
*.dialup.neobee.net.



+41 Profil

icon Re: GROUP BY bug i resenje21.04.2007. u 07:58 - pre 206 meseci
Ovde ti je objasnjenje za ceo feature o kom pricamo http://www.mysql.org/doc/refma...en/group-by-hidden-fields.html
a obrati paznju na
Citat:

Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.


Dakle, nije bug, vec odstupanje od standarda zbog poboljsanja performansi, cija zloupotreba dovodi do ovakvih "pogresnih ocekivanja"
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: GROUP BY bug i resenje21.04.2007. u 08:33 - pre 206 meseci
Goran je potpuno u pravu. To je nesto sto ne prolazi na ozbiljnim sistemima.

Upit koji treba napraviti je nesto slozeniji od prostog SELECT-a, i glasi:
Code:

SELECT t1.a, t1.b, t1.c
  FROM neka_tabela AS t1
 WHERE t1.c = (SELECT MAX(t2.c)
                 FROM neka_tabela AS t2
                WHERE t2.a = t1.a)
 GROUP BY t1.a, t1.b, t1.c


"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

Zmaj
Predrag Krstić
web developer
Zrenjanin

Član broj: 1035
Poruke: 382

Sajt: https://pkrstic.wordpress..


+4 Profil

icon Re: GROUP BY bug i resenje27.04.2007. u 18:23 - pre 206 meseci
zahvaljujem se na odgovoru, posto me je ES nekoliko dana zezao pa nisam mogao da mu pristupim, a ono sto se desava sa dodavanjem limita me je samo zabunilo, ali odmah po postavljanju poruke sam ustanovio da upit nije ispravan, ali nisam bio u mogucnosti da to i napisem, tj da izmenim post. Zahvaljujem se se jos jednom
 
Odgovor na temu

[es] :: MySQL :: GROUP BY bug i resenje

[ Pregleda: 2466 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.