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

MySQL - Kontroluj, który wiersz jest zwracany przez grupę przez

Nazywa się to wybieraniem grupowego maksimum kolumny. Oto kilka różnych podejść do mysql.

Oto jak bym to zrobił:

SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id

Będzie to stosunkowo wydajne, chociaż mysql utworzy w pamięci tabelę tymczasową dla podzapytania. Zakładam, że masz już indeks (id, version_id) dla tej tabeli.

Wadą SQL jest to, że w przypadku tego typu problemu trzeba mniej więcej użyć podzapytania ( półłączenia są kolejnym przykładem).

Podzapytania nie są dobrze zoptymalizowane w mysql, ale nieskorelowane podzapytania nie są tak złe, o ile nie są tak ogromne, że zostaną zapisane na dysku, a nie w pamięci. Biorąc pod uwagę, że w tym zapytaniu są tylko dwa inty, podzapytanie może mieć miliony wierszy na długo przed tym, ale podzapytanie select * w pierwszym zapytaniu może ucierpieć z powodu tego problemu znacznie wcześniej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przechowywać wartości NULL w polach daty i godziny w MySQL?

  2. mysql wybierz dynamiczne wartości wierszy jako nazwy kolumn, inną kolumnę jako wartość

  3. PHP/MySQL wstaw wiersz, a następnie pobierz „id”

  4. #1071 — Określony klucz był za długi; maksymalna długość klucza to 1000 bajtów

  5. Wyzwalacze MySQL nie mogą aktualizować wierszy w tej samej tabeli, do której przypisany jest wyzwalacz. Sugerowane obejście?