Nie działa tak, jak uważasz, że powinno, a dokumentacja wyjaśnia znaczenie DISTINCT
:chodzi o odrębne wiersze :
(źródło:http://dev.mysql.com /doc/refman/5.7/en/select.html )
Musisz pogrupować wiersze według użytkowników, aby uzyskać jeden wiersz dla każdego użytkownika, ale niestety nie możesz w ten sposób uzyskać ich ostatniego wyniku. Możesz uzyskać maksymalny, minimalny, średni wynik i inne obliczone wartości. Sprawdź listę GROUP BY funkcje agregujące
.
Zapytanie
To jest zapytanie, które pobiera potrzebne wartości:
SELECT u.fsname, u.emailaddress, la.score
FROM users u
INNER JOIN attempts la # 'la' from 'last attempt'
ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr # 'mr' from 'more recent' (than last attempt)
ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL
Jak to działa
Dołącza do tabeli użytkownicy
(z aliasem u
) z tabelą próby
(alias jako la
, skrót od "ostatnia próba") przy użyciu adresu e-mail
jako pasująca kolumna. To połączenie, które już masz w zapytaniu, dodałem aliasy, ponieważ od tego momentu pomagają ci pisać mniej.
Następnie dołącza do prób
tabela ponownie (alias mr
z „nowszych niż ostatnia próba”). Pasuje do każdej próby z la
ze wszystkimi próbami mr
tego samego użytkownika (identyfikowanego przez jego adres e-mail
) i które mają nowszą datetime
. LEWO DOŁĄCZ
zapewnia, że każdy wiersz z la
pasuje do co najmniej jednego wiersza z mr
. Wiersze z la
które nie pasują do mr
to wiersze, które mają największe wartości datetime
dla każdego adresu e-mail
. Są one dopasowywane do wierszy pełnych NULL
(dla pana
część).
Wreszcie GDZIE
Klauzula zachowuje tylko te wiersze, które mają NULL
w data i godzina
kolumna wiersza wybranego z mr
. To są wiersze, które pasują do najnowszych wpisów z la
dla każdej wartości adres e-mail
.
Uwagi dotyczące wydajności
Aby szybko uruchomić to zapytanie (dowolne zapytanie! ) wymaga indeksów w kolumnach używanych w JOIN
, GDZIE
, GRUPA WG
i ZAMÓW PRZEZ
klauzule.
Nie powinieneś używać adresu e-mail
w tabeli próby
do identyfikacji użytkownika. Powinieneś mieć PK
(klucz podstawowy) w tabeli users
i użyj go jako FK
(klucz obcy) w tabeli próby
(i inne tabele, które odnoszą się do użytkownika). Jeśli adres e-mail
jest PK
tabeli użytkowników
zmień go na UNIKALNY INDEKS
i użyj nowego INTEGER AUTO INCREMENT
ed kolumna identyfikator użytkownika
jako PK
zamiast. Indeksy w kolumnach numerycznych są szybsze i zajmują mniej miejsca niż indeksy w kolumnach z ciągami.