Nefunguje to tak, jak si myslíte, že by mělo a dokumentace vysvětluje význam DISTINCT
:jde o odlišné řádky :
(zdroj:http://dev.mysql.com /doc/refman/5.7/en/select.html )
Musíte seskupit řádky podle uživatele, abyste získali jeden řádek pro každého uživatele, ale bohužel tímto způsobem nemůžete získat jeho nejnovější skóre. Můžete získat maximální, minimální, průměrné skóre a další vypočítané hodnoty. Podívejte se na seznam GROUP BY agregační funkce
.
Dotaz
Toto je dotaz, který získává hodnoty, které potřebujete:
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 funguje
Spojí tabulku uživatele
(přezdívaný jako u
) s tabulkou pokusy
(přezdívaný jako la
, zkratka pro "poslední pokus") pomocí e-mailová adresa
jako odpovídající sloupec. Je to spojení, které již máte ve svém dotazu, přidal jsem aliasy, protože vám pomohou psát méně od tohoto bodu.
Dále se připojí k pokusům
znovu tabulka (přezdívaná jako mr
z „novějších než poslední pokus"). Odpovídá každému pokusu z la
se všemi pokusy od mr
stejného uživatele (identifikovaného podle jeho e-mailové adresy
) a které mají novější datum a čas
. LEVÉ PŘIPOJENÍ
zajišťuje, že každý řádek z la
odpovídá alespoň jednomu řádku z mr
. Řádky z la
které nemají shodu v mr
jsou řádky, které mají největší hodnoty datetime
pro každou e-mailovou adresu
. Jsou přiřazeny k řádkům plným NULL
(pro mr
část).
Nakonec WHERE
klauzule zachovává pouze řádky, které mají NULL
v datetime
sloupec řádku vybraného z mr
. Toto jsou řádky, které odpovídají nejnovějším záznamům z la
pro každou hodnotu e-mailová adresa
.
Poznámky k výkonu
Aby tento dotaz běžel rychle (jakýkoli dotaz! ) potřebuje indexy ve sloupcích použitých v JOIN
, KDE
, GROUP BY
a ORDER BY
klauzule.
Neměli byste používat e-mailovou adresu
v tabulce pokusy
k identifikaci uživatele. Měli byste mít PK
(primární klíč) v tabulce uživatelé
a použijte to jako FK
(cizí klíč) v tabulce pokusy
(a další tabulky, které odkazují na uživatele). Pokud e-mailová adresa
je PK
tabulky uživatelů
změňte jej na UNIQUE INDEX
a použijte nový INTEGER AUTO INCREMENT
ed sloupec userId
jako PK
namísto. Indexy v numerických sloupcích jsou rychlejší a zabírají méně místa než indexy v řetězcových sloupcích.