Ho una tabella con una chiave primaria a più colonne (città/stato/data) e molte altre colonne di dati. Sto cercando di ottenere gli ultimi dati per ogni città/stato. Come lo faccio in modo pulito/efficiente? In questo momento io posso fare questo facendo una prima query per ottenere la lista di tutti i file che sto cercando di recuperare, seguita da una seconda query con una massiccia clausola WHERE:Come selezionare più righe per chiave primaria multi-colonna in MySQL?
SELECT state, city, max(date) from data GROUP BY city, state;
+-------+---------------------+------------+
| state | city | MAX(date) |
+-------+---------------------+------------+
| CA | San Francisco | 2013-09-01 |
| CA | Los Angeles | 2013-08-01 |
| NY | New York | 2013-10-01 |
| ... | ... (many rows) ... | ... |
+-------+---------------------+------------+
SELECT * FROM data WHERE
(state = "CA" AND city = "San Francisco" AND date='2013-09-01') OR
(state = "CA" AND city = "Los Angeles" AND date='2013-08-01') OR
(state = "NY" AND city = "New York" AND date='2013-10-01') OR
...
Questo è veramente brutto e inefficiente e se la prima query restituisce molte righe, la seconda query potrebbe essere troppo lunga. Chiaramente se ho una chiave primaria a colonna singola, potrei usare una sottoselezione con IN(), ma qui non è possibile. Eventuali suggerimenti?
AGGIORNAMENTO: Ho provato il suggerimento di Bill con una sottoselezione, ma non sta usando nessuna chiave e sta prendendo per sempre. Se limito la sottoselezione a restituire solo 5 righe, restituisce in 0,64 s. Se lascio che restituisca tutte le 73 combinazioni città/stato, ci vuole molto tempo (query ancora in esecuzione).
EXPLAIN SELECT * FROM data WHERE (city, state, date) IN (SELECT state, city, MAX(date) FROM data GROUP BY city, state)
+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| 1 | PRIMARY | data | ALL | NULL | NULL | NULL | NULL | 13342 | Using where |
| 2 | DEPENDENT SUBQUERY | data | index | NULL | PRIMARY | 57 | NULL | 8058 | Using index |
+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+
qual è il risultato finale che si sta tentando di ottenere – Ibu