Funkcja MIN(date) a poprawny wynik zapytania

0
SELECT MIN(date), teachers.name, teachers.surname, schools.school_name 
FROM exams, teachers, schools 
WHERE exams.id_teacher=teachers.id_teacher 
AND exams.id_school=schools.id_school 
AND schools.school_name="X"
ORDER BY exams.date LIMIT 1

Mam znaleźć nazwisko osoby, która pierwsza przeprowadziła egzamin w takiej to a takiej szkole. I mam problem, bo u mnie tak wyglądające zapytanie podaje wynik błędny. Rzeczywiście data jest dobra, ale już nazwisko osoby nie.
Gdy dodam

GROUP BY teachers.surname

wynik jest dobry. Czy GROUP BY jest konieczne, czy moje zapytanie jest błędne?

1

Nie rozumiem sensu order by i limit tutaj skoro masz min. Przecież agregat zwróci ci tylko jeden rekord! Poza tym grupowanie jest konieczne jeśli używasz agregatu. Wyobraź sobie że są 3 osoby które mają identyczną datę. Którą osobę chciałabyś zobaczyć w wyniku w takiej sytuacji? Pamiętaj ze ten agregat zwróci zawsze tylko 1 rekord wynikowy. Więc która z tych osób to będzie? No właśnie. Dlatego musisz dodać grupowanie po polach które chcesz zobaczyć później w wynikach. Oczywiście wtedy twoje sortowanie i limit będą już miały jakiś sens.

0

Ok, dzięki.
Tylko mam taki problem, że jak wyrzucę ORDER BY i LIMIT to wyrzuca mi wszystkie daty.

0

To może czas nauczyć się co w ogóle robisz, a nie stosować metodę prób i błędów? o_O No ale okres poświąteczny, więc jeszcze chwilowo mówię ludzkim glosem:

  1. Agregaty (min, max, avg itd) zwracaja jedną wartość. min(X) zwróci ci najmniejszą wartość z kolumny X. To jest wartość, więc nie ma znaczenia rekord do którego ona należy. W szczególności lepiej to widać dla avg bo tam dostajesz średnią wartość, która może nie występować w żadnym rekordzie.
  2. Z racji powyższego, nie ma generalnie sensu żeby poza agregatem w select mieć jakiekolwiek inne pola. Szczególnie, że może nie istnieć rekord z wartością wyliczoną przez agregat (patrz avg) a może też być ta że jest wiele rekordów z daną wartością i który rekord miałby się pojawić jako wynik?
  3. Można dokonać grupowania po polach które chcesz zobaczyć w rekordach wynikowych, ale trzeba rozumieć co się wtedy stanie: nastąpi grupowanie po kolumnie Y i wartość agregatu na kolumnie X zostanie policzona dla każdej unikalnej wartości Y OSOBNO. W twoim przypadku, jeśli zgrupujesz po nazwisku nauczyciela to w wyniku dostaniesz listę WSZYSTKICH nauczycieli i dla każdego z nich minimalną datę którą miał przyporządkowaną.
  4. W związku z tym możesz takie zestawienie teraz posortować a następnie wybrać sobie pierwszy element.

Ale jak nie trudno zauważyć, równie dobrze możesz po prostu posortować wszystkie rekordy i wybrać pierwszy, bez grupowania i agregatu...

0

@Shalom, agregaty zwrócą jedną wartość jeżeli tylko nie ma dodatkowych kolumn w zapytaniu. Jeżeli są dodatkowe kolumny, to wymagane jest grupowanie by wyznaczyć podzbiory, dla których będzie aplikowany agregat.
Podobnie ORDER BY ma sens ponieważ przy dodatkowych kolumnach będzie dużo różnych wartości (pogrupowanych) i będziemy je sortować w specyficzny sposób.
Ostatni element czyli LIMIT ogranicza nam zbiór wyników.

Inaczej mówiąc masz tu zapytanie - wybierz datę i kilka innych kolumn dla podzbiorów wyznaczonych wg. kolumny teachers.surname, posortuj je po dacie i zwróć pierwszy wynik. Jest sensownie.

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