Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 6 odgovora
  • 3.235 pregleda

Najnovija ↓

GROUP BY bug i resenje 21.04.2007. u 00:42 · pre 237 meseci #1
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.
Re: GROUP BY bug i resenje 21.04.2007. u 00:48 · pre 237 meseci #2
Nije u pitanju bug vec su tvoja ocekivanja bila pogresna.

Probaj:

Code:

SELECT 
  a, 
  MAX(b), 
  MAX(c)
FROM
  table
GROUP BY
  a
Re: GROUP BY bug i resenje 21.04.2007. u 01:56 · pre 237 meseci #3
@goranvuc

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


Re: GROUP BY bug i resenje 21.04.2007. u 08:35 · pre 237 meseci #4
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 ...
Re: GROUP BY bug i resenje 21.04.2007. u 08:58 · pre 237 meseci #5
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"
Re: GROUP BY bug i resenje 21.04.2007. u 09:33 · pre 237 meseci #6
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

Potpis
"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
Re: GROUP BY bug i resenje 27.04.2007. u 19:23 · pre 237 meseci #7
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
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme