sql >> Databáze >  >> RDS >> Mysql

Spouštění více dotazů v MySQL bez použití poddotazu

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.




  1. Golang, mysql:Chyba 1040:Příliš mnoho připojení

  2. Jak mohu změnit indexovaný varchar (255) z utf8 na utf8mb4 a stále zůstat pod maximální délkou klíče 767?

  3. jak počítat horizontální hodnoty v databázi?

  4. ORA-00838