sql >> Database teknologi >  >> RDS >> Mysql

Kørsel af flere forespørgsler i MySQL uden at bruge underforespørgsel

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.




  1. Node.js mysql-forespørgselssyntaksproblemer OPDATERING HVOR

  2. Hvordan vælger man sum -eller- 0, hvis der ikke findes nogen poster?

  3. Optimering af MySQL-forespørgsel med flere venstre joinforbindelser

  4. Bedste måde at gemme span på tid i en MySQL database?