Witam
Mam pytanie. Otóż mam tabele
Szkola
Id_szkola
Miasto
Poziom
Oraz
Uczniowie
Id_ucznia
Imię
Nazwisko
Id_szkola
Klasa
Jak znaleźć szkoły które mają więcej niż 50 uczniów?
Witam
Mam pytanie. Otóż mam tabele
Szkola
Id_szkola
Miasto
Poziom
Oraz
Uczniowie
Id_ucznia
Imię
Nazwisko
Id_szkola
Klasa
Jak znaleźć szkoły które mają więcej niż 50 uczniów?
group by
, having
, count
.
Having ogranicza rekordy dopiero po ich wyciągnięciu, co może mocno wpłynąć na wydajność (tak mi się wydaje). Jeżeli zrobi joina i później having, to dojoinuje całą tabelę z uczniami i dopiero na końcu having to ograniczy (przynajmniej ja tak ostatnio miałem, jak zrobiłem join z tabelą, która ma 50 mln rekordów :D). Można spróbować tak:
SELECT
s.Id_szkola
FROM Szkola s
JOIN (
SELECT
Id_szkola,
COUNT(*) AS count
FROM Uczniowie
GROUP BY Id_szkola
) u ON u.Id_szkola = s.Id_szkola AND u.count > 50;
Prawdopodobnie w tym przypadku to akurat nie będzie miało znaczenia (z uwagi na względnie małą tabelę z uczniami), ale dobrze jest być świadomym czego się używa.
Edit
Wykonałem i jedno i drugie zapytanie na swojej testowej bazie (gdzie tabele imitująca Uczniowie
ma ~ 2 mln rekordów) i pierwsze zapytanie wykonuje sie ~ 430ms, a to niżej ~ 740 ms:
SELECT
s.Id_szkola,
COUNT(*) as count
FROM Szkola s
JOIN Uczniowie u ON u.Id_szkola = s.Id_szkola
GROUP BY u.Id_szkola
HAVING COUNT(u.Id_ucznia) > 50
Dziękuje Wam bardzo, działa :-). Rzeczywiście Desu w moim przypadku to nie ma znaczenia, ale zawsze dobrze poznać coś nowego :-) Patryk, odnośnie tytułowania wątków, już będę wiedział. To mój pierwszy post na tym forum. Następny na pewno będzie już dobrze zatytułowany :-)