Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kolejność rekordów w GROUP BY
Forum PHP.pl > Forum > Bazy danych > MySQL
kitol
Mam tabelę a w niej kolumny: user_id, record_id (primary key,autoincrement), oraz inne pola z danymi.
Potrzebuję wyjąć dla każdego usera jeden najstarszy rekord (czyli ten który ma najmniejszy record_id dla danego usera). Zapytanie ma zwracać tyle wierszy ile jest userów w każdym wierszu dane (pozostałe kolumny) z najstarszego rekordu.
Zapytanie wygląda tak:

  1. SELECT * FROM tabela GROUP BY user_id


Zauważyłem, (MySQL 5.0) że za każdym razem dla każdego usera zwracany jest wynik z najmiejszym record_id pomimo, że w zapytaniu nie mam zdefiniowanego sortowania po record_id. Czy baza przyjmuje takie sortowanie domyślnie (bo record_id jest kluczem głównym)? Czy takie wyniki będą zwracane zawsze? Czy muszę wprowadzić do zapytania klauzulę ORDER BY i LIMIT 1? Zależy mi na szybkości dla dużej ilości rekordów.
najtje
Moim zdaniem to co wypisywane jest w wierszu i co nie jest objęte klauzulą GROUP BY jest wpisywane na zasadzie tego który wiersz pierwszy zakwalifikuje się do spełnienia warunku group by podczas skanowania danych tabeli.

Spróbuj uaktualnić id na jakieś inne i sprawdzić czy wyniki się powtarzają (id chyba generowane jest poprzez autoincrement więc dobrze obrazuje kolejność w jakim były umieszczane dane w tabeli - chociaż uaktualnienie można zrealizować też poprzez dopisanie nowych danych i unieważnienie starego wpisu i dopiero po jakimś porządkowaniu bazy by to wyszło).
Trochę dziwne (z punktu widzenia optymalizacji) by było gdyby baza zwracała zawsze minimalną wartość - oznaczałoby to że jeśli klauzula group by nie odnosi się do wszystkich pól odpowiedzi, które produkuje zapytanie to dane wcześniej poddawane są jakiemuś sortowaniu podczas skanowania tabeli.
nevt
Wg moich doświadczeń z MySQL5 pole klucza podstawowego jest domyślnym porządkiem sortowania tabeli w przypadku SELECT'a bez klauzuli ORDER BY. Robiłem proste doświadczenie, po dodaniu kilku rekordów z ID=AUTOINCREMENT ręcznie modyfikowałem wartości kluczy ID i ewidentnie zmieniała się wtedy kolejność rekordów zwracanych przez SELECT - dokładnie tak jakbym wpisywał klauzulę ORDER BY ID.

Więc możesz założyć - przynajmniej w przypadku MySQL - że twoja konstrukcja zapytania będzie poprawna i optymalna - ale nie ma gwarancji że będzie działać po ew. zmianie serwera bazy danych...

Pozdrawiam.
mwojcik
Grupowanie w MySQLu nie dziala poprawnie, bo wedlug algebry relacji na ktorej opiera sie SQL, bez sensu jest grupowanie wedlug jakiegos parametru i nie uzywanie agregowania wedlug innego. Twoje zapytanie powinno wygladac mniej wiecej tak :
  1. SELECT * FROM tabela WHERE record_id IN (SELECT MIN(record_id) FROM tabela GROUP BY user_id) ORDER BY record_id DESC

, ktore to zapytanie najpierw wyciaga wszystkie rekordy o najmniejszym id (najwczesniejsze) po grupowane wedlug user_id i nastepnie do wyniku dolacza te rekordy ze wszystkimi danymi, ktorych record_id jest wsrod wyciagnietych w podzapytaniu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.