Znajdowanie szkół mających więcej niż 50 uczniów

0

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?

2

group by, having, count.

1

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
0

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 :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1