Nie działa tak, jak uważasz, że powinno, a dokumentacja wyjaśnia znaczenie DISTINCT :chodzi o odrębne wiersze :
(źródło:https://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.