Cum funcționează
Cele zece probleme de la GAMING respectă tiparul Subiectului I: a) pe un tabel, b) pe amândouă.
Legătura se face prin idj — codul jucătorului, prezent și în Jocuri.
a) DISTINCT pe o coloană
Mai multe jocuri pot fi din același gen. SELECT gen FROM Jocuri ar afișa „FPS" de trei ori;
DISTINCT păstrează o singură apariție a fiecărei valori.
Dacă s-ar cere câte genuri există, nu care sunt: COUNT(DISTINCT gen) — vezi
problema #136.
Atenție: DISTINCT se aplică pe tot rândul. SELECT DISTINCT gen, platforma întoarce perechile
unice gen-platformă, care sunt mult mai multe decât genurile unice. Explicație detaliată la
problema #133.
b) „Pentru fiecare jucător” — și jucătorii fără jocuri
„Fiecare" cere GROUP BY. Partea care decide corectitudinea e alegerea joncțiunii:
- cu
INNER JOIN, un jucător fără niciun joc dispare din listă — iar el e exact cazul interesant
- cu
LEFT JOIN, apare cu 0, dacă numeri corect
„Dacă numeri corect" înseamnă COUNT(g.idg), nu COUNT(*):
| Scris |
Pentru un jucător fără jocuri |
COUNT(*) |
1 — numără rândul cu NULL-uri produs de LEFT JOIN |
COUNT(g.idg) |
0 — COUNT pe o coloană ignoră valorile NULL |
Pe datele de test, un jucător e înscris fără niciun joc înregistrat: cu varianta corectă apare cu 0,
cu COUNT(*) ar apărea cu 1, iar cu INNER JOIN n-ar apărea deloc. Trei variante, trei
rezultate, niciuna nu dă eroare. Aceeași capcană, pe alt exemplu, la
problema #128.
Se grupează după j.username pentru că asta se afișează. Dacă doi jucători ar avea același username
(imposibil în practică, dar posibil în tabel), corect ar fi GROUP BY j.idj, j.username.
Greșeli frecvente
COUNT(*) cu LEFT JOIN — jucătorii fără jocuri ies cu 1 în loc de 0.
INNER JOIN la „fiecare jucător" — jucătorii fără jocuri dispar complet din răspuns.
GROUP BY uitat — un singur număr, totalul jocurilor din bază.
SELECT DISTINCT gen, platforma la cerința a) — se cer genurile, nu combinațiile.
GROUP BY j.idj cu SELECT j.username — în Oracle dă eroare; grupează după ce afișezi.
COUNT(DISTINCT g.idg) — inofensiv, dar idg e deja unic; sugerează că te aștepți la dubluri.