sql >> Databasteknik >  >> RDS >> Mysql

Kapslad Select-sats i MYSQL join

Jag gör den här typen av fråga annorlunda, med en uteslutningskoppling istället för en underfråga. Du vill hitta raderna av B som har maxtiden för ett givet ID; med andra ord, där ingen annan rad har en större tid och samma ID.

SELECT A.*, B.*
FROM A JOIN B ON B.ID = A.ID
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time
WHERE B2.ID IS NULL

Du kan också använda en härledd tabell , som borde fungera bättre än att använda en korrelerad underfråga.

SELECT A.*, B.*
FROM A JOIN B ON B.ID = A.ID
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2
  ON (B.ID, B.Time) = (B2.ID, B2.Time)

P.S.:Jag har lagt till greatest-n-per-group märka. Den här typen av SQL-frågor dyker upp varje vecka på Stack Overflow, så du kan följa taggen för att se dussintals liknande frågor och deras svar.




  1. PHP och MySQL:Antal returnerade rader

  2. Dumpar SQL-frågor till skärmen i Laravel

  3. MySQL får datumet för n dagar sedan som en tidsstämpel

  4. Topp 9 användbara Oracle Apps-skrivarfrågor