[ Zmaj @ 20.04.2007. 23:42 ] @
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.
[ goranvuc @ 20.04.2007. 23:48 ] @
Nije u pitanju bug vec su tvoja ocekivanja bila pogresna.

Probaj:

Code:

SELECT 
  a, 
  MAX(b), 
  MAX(c)
FROM
  table
GROUP BY
  a
[ milosijaa @ 21.04.2007. 00:56 ] @
@goranvuc

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


[ goranvuc @ 21.04.2007. 07:35 ] @
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 ...
[ goranvuc @ 21.04.2007. 07:58 ] @
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"
[ chachka @ 21.04.2007. 08:33 ] @
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

[ Zmaj @ 27.04.2007. 18:23 ] @
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