Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dwa pytania o GROUP BY
Torcha
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.07.2003

Ostrzeżenie: (0%)
-----


Możecie mi wyjaśnić, czym jest grupowanie (GROUP BY)? Z tego co zdążyłam zrozumiec, to jest to jakieś uproszczone sortowanie, polegające na tym, że wartości nie są porządkowane od najmniejszej do największej lub na odwrót, lecz jedynie "składane" "obok siebie" te, które są identyczne. Dobrze zrozumiałam? Mam jeszcze wątpliwości co do tego, kiedy grupowanie się odbywa. Wiem, że sortowanie odbywa się po całej tabeli i dopiero potem zwracana jest ustalona liczba rekordów (LIMIT). Nie wiem jednak, jak to jest z grupowaniem, ale wydaje mi się, że najpierw zostaje "wyciągnięta" żądana liczba rekordów, a dopiero później zostają one pogrupowane. Czy mam rację?

--
W trupa obrócę każdego, kto na mej drodze stanie.
Torcha

PS: Ja dopiero zaczynam poznawać mowę, którą posługują się bazy danych.

PS2: Dlaczego nie można pisać jako Gość? To absurd, że musiałam się zarejestrować tylko po to, by zadać dwa pytania.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
msulik
post
Post #2





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 31.03.2002
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Cytat
Czy przy grupowaniu zakładany jest jakiś porządek, czy kolejność następujących po sobie grup jest zależna od pierwszego wystąpienia pola należącego do danej grupy, a każdy następny rekord z polem o tej samej wartości w tej samej kolumnie  jest jedynie "dociągany" do tych "pierwszych"?
Nie wiem dokładnie jak to jest realizowane, ale wydaje mi się, że nie jest ważna kolejność grupowania - dla funkcji agregujących nie ma to znaczenia. Najpierw zostają utworzone grupy, a następnie na każdej z tych grup działa funkcja agregująca. Prawdopodobnie optymalizator sprawia, że nie są zapamiętywane dokładnie wszystke rekordy, a jedynie z każdego kolejnego rekordu wyciągane są potrzebne informacje, które wykorzystujemy gdy używamy funkcji agregujących. Nie ma bowiem sensu zapamiętywać w grupach wszystkich rekordów, jeśli chodzi nam tylko np. o sumę (którą można policzyć liniowo) czy średnią wartości (średnia to iloraz sumy wartości przez ich ilość, a więc SUM()/COUNT() ).

Cytat
(...) w jakiej kolejności to wszystko się odbywa: funkcje agregujące i grupowanie działają na wszystkich rekordach z tabeli czy tylko tych ograniczonych klauzulą LIMIT, która wówczas musiałaby zostać "wykonywana" przed klauzulą GROUP BY? Wiesz, jaka jest kolejność? Na koniec chciałabym wiedzieć, jaka jest zależność pomiędzy grupowaniem a sortowaniem - jak się ma jedno do drugiego?


Rozpatrzmy składnię SELECT'a:
[sql:1:ccc8a63cae]select lista_wybierania from lista_tabel where wyrażenie group by lista_kolumn
having wyrażenie order by lista kolumn limit opcje_limit[/sql:1:ccc8a63cae]

Kolejność wykonywania:
WHERE -> GROUP BY -> funkcje agregujące -> HAVING -> ORDER BY -> LIMIT

Mimo, że HAVING jest wykonywane PO wybraniu rekordów, to jak mówi dokumentacja MySQL, jeśli użyjemy HAVING oraz jeśli nie używamy GROUP BY i funkcji agregujących, to warunek HAVING zostanie dołączony do WHERE w celu zoptymalizowania warunku:
Cytat
HAVING is merged with WHERE if you don't use GROUP BY or group functions (COUNT(), MIN()...).
a także niektóre warunki, które występują w HAVING mogą zostać sprawdzone:
Cytat
Before each record is output, those that do not match the HAVING clause are skipped
(domyślam się, że chodzi o takie warunki, które nie wymagają odwołania się do wyniku grupowania).
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 08:31