Funkcja MIN(date) a poprawny wynik zapytania

Odpowiedz Nowy wątek
2015-01-02 18:54
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?

Pozostało 580 znaków

2015-01-02 19:05
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.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2015-01-02 19:06

Pozostało 580 znaków

2015-01-02 20:24
0

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

Pozostało 580 znaków

2015-01-02 20:50
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...


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
Czytać potrafię, szukać też. Na forum staram się pytać jak najrzadziej. Za merytoryczną część postu dziękuję, osobiste wycieczki proszę schować do kieszeni. - Katja 2015-01-02 21:59
czytać potrafię, szukać też -> twoje pytania temu przeczą, bo to co napisałem jest też napisane w dokumentacji. Ale tam pewnie nie zaglądałaś a na jutubie nie było filmiku z tego zakresu ;] - Shalom 2015-01-02 22:05
Niestety, pudło. - Katja 2015-01-02 22:12
Z własnego doświadczenia wiem, że metoda prób i błędów w przypadku SQL sprawdza się najlepiej. W przeciwnym wypadku trzeba by tracić czas na naukę i próby zrozumienia tego potwornego języka. - somekind 2015-01-03 00:21

Pozostało 580 znaków

2015-01-02 23:02
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.

Przeczytałeś oba moje posty? A nie tylko pierwsze zdanie? :D - Shalom 2015-01-02 23:09
#nowyrok... jeszcze trzyma :D - Koziołek 2015-01-02 23:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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