Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zagnieżdżona instrukcja Select w łączeniu MYSQL

Tego typu zapytania wykonuję inaczej, z sprzężeniem wykluczającym zamiast podzapytania. Chcesz znaleźć wiersze B, które mają maksymalny czas dla danego identyfikatora; innymi słowy, gdzie żaden inny wiersz nie ma większego czasu i tego samego identyfikatora.

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

Możesz także użyć tabeli pochodnej , które powinno działać lepiej niż użycie skorelowanego podzapytania.

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)

PS:Dodałem greatest-n-per-group etykietka. Tego typu pytanie SQL pojawia się co tydzień w Stack Overflow, więc możesz śledzić ten tag, aby zobaczyć dziesiątki podobnych pytań i odpowiedzi na nie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django:sqlite dla dewelopera, mysql dla prod?

  2. MySQL:GROUP_CONCAT z ORDER BY COUNT?

  3. Jak pobrać pierwszy i ostatni rekord rekordu zgrupowanego w zapytaniu MySQL za pomocą funkcji agregujących?

  4. Ustawiam kolumnę MySQL na NOT NULL, ale nadal mogę wstawić pustą wartość

  5. Błąd połączenia php MySql