Det virker ikke, som du tror, det skal, og dokumentationen forklarer betydningen af DISTINCT
:det handler om distinkte rækker :
(kilde:http://dev.mysql.com /doc/refman/5.7/da/select.html )
Du skal gruppere rækkerne efter bruger for at få en enkelt række for hver bruger, men du kan desværre ikke få deres seneste score på denne måde. Du kan få maksimum, minimum, gennemsnitsscore og andre beregnede værdier. Tjek listen over GRUPPER EFTER aggregerede funktioner
.
Forespørgslen
Dette er forespørgslen, der får de værdier, du har brug for:
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
Sådan virker det
Det forbinder tabel brugere
(kaldet som u
) med tabel forsøg
(kaldet som la
, forkortelse for "sidste forsøg") ved hjælp af e-mailadresse
som den matchende kolonne. Det er det join, du allerede har i din forespørgsel. Jeg tilføjede aliasserne, fordi de hjælper dig med at skrive mindre fra det tidspunkt.
Dernæst slutter den sig til forsøg
tabel igen (aliaseret som mr
fra "nyere end det sidste forsøg"). Det matcher hvert forsøg fra la
med alle forsøgene fra mr
af den samme bruger (identificeret ved deres e-mailadresse
) og der har en nyere datetime
. LEFT JOIN
sikrer, at hver række fra la
matcher mindst én række fra mr
. Rækkerne fra la
der ikke har et match i mr
er de rækker, der har de største værdier af datetime
for hver e-mailadresse
. De matches med rækker fyldt med NULL
(for mr
del).
Til sidst, WHERE
klausul beholder kun de rækker, der har NULL
i datetime
kolonne i rækken valgt fra mr
. Dette er de rækker, der matchede de seneste poster fra la
for hver værdi af e-mailadresse
.
Ydeevnebemærkninger
For at køre hurtigt denne forespørgsel (enhver forespørgsel! ) har brug for indekser på de kolonner, der bruges i JOIN
, HVOR
, GRUPPER EFTER
og BEstil efter
klausuler.
Du bør ikke bruge e-mailadresse
i tabel forsøg
at identificere brugeren. Du skal have en PK
(primær nøgle) på tabel brugere
og brug det som en FK
(fremmednøgle) i tabel forsøg
(og andre tabeller, der refererer til en bruger). Hvis e-mailadresse
er PK
af tabel brugere
ændre det til et UNIQUE INDEX
og brug en ny INTEGER AUTO INCREMENT
ed kolonne brugerId
som PK
i stedet. Indekserne på numeriske kolonner er hurtigere og bruger mindre plads end indekserne på strengkolonner.