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

MySQL - Controlla da quale riga viene restituita da un gruppo

Si chiama selezione del massimo per gruppo di una colonna. Ecco diversi approcci per mysql.

Ecco come lo farei:

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

Questo sarà relativamente efficiente, sebbene mysql creerà una tabella temporanea in memoria per la sottoquery. Presumo che tu abbia già un indice su (id, version_id) per questa tabella.

È una carenza in SQL che devi più o meno usare una sottoquery per questo tipo di problema ( semi join sono un altro esempio).

Le sottoquery non sono ben ottimizzate in MySQL, ma le sottoquery non correlate non sono così male finché non sono così enormi da essere scritte su disco anziché in memoria. Dato che in questa query ha solo due int, la sottoquery potrebbe essere di milioni di righe molto prima che ciò accadesse, ma la sottoquery select * nella tua prima query potrebbe soffrire di questo problema molto prima.