Nefunguje to tak, jak si myslíte, že by mělo a dokumentace vysvětluje význam DISTINCT :jde o odlišné řádky :
(zdroj:https://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.