(Non riesco a parlare inglese molto bene, ma cercherò di fare il mio meglio)MySQL che seleziona valori distinti ordine per data/ora
Ho due tabelle.
table1
id carid user --------------------- 1 | A001 | user1 2 | A002 | user1 3 | A003 | user2 4 | A002 | user3
table2
id carid datetime lat lon ---------------------------------------------------- 1 | A001 | 2013-25-06 10:00:00 | -23.0000 | -46.0000 2 | A002 | 2013-25-06 10:01:00 | -24.3500 | -45.3200 3 | A002 | 2013-25-06 10:02:00 | -24.3800 | -45.3300 4 | A001 | 2013-25-06 10:05:00 | -23.0500 | -46.1000 5 | A003 | 2013-25-06 10:07:00 | -24.3500 | -45.3200 6 | A001 | 2013-25-06 10:10:00 | -23.0700 | -46.1200
ho bisogno di selezionare ogni registro distinto "CARID" da "user1" ordinato da datetime
Risultato ho bisogno:
carid datetime lat lon -------------------------------------------------- A001 | 2013-25-06 10:10:00 | -23.0700 |-46.1200 A002 | 2013-25-06 10:02:00 | -24.3800 |-45.3300
Il modo in cui sto realizzando è la selezione di tutti i "carid" da parte dell'utente che desidero e selezionando ogni riga singolarmente tramite .net.
`SELECT carid FROM table1 where user = “user1”;`
carid ----- A001 A002
poi selezionando la riga che voglio:
SELECT * FROM table2 WHERE car_id='A001' ORDER BY datetime DESC limit 1
SELECT * FROM table2 WHERE car_id='A002' ORDER BY datetime DESC limit 1
Ma a seconda del numero di registri "di CARID" da quell'utente devo fare un sacco di querys. Non so se è possibile farlo con un solo SELEZIONA migliorare il modo in cui sto facendo, ma questo è quello che ho provato:
SELECT car_id, datetime, lat, lon from table1
INNER JOIN table2 on carid = car_id
WHERE user = 'user1'
GROUP BY carid
ORDER BY datetime DESC;
Risultato:
carid datetime lat lon ------------------------------------------------------ A002 | 2013-25-06 10:01:00 | -24.3500 | -45.3200 A001 | 2013-25-06 10:02:00 | -23.0000 | -46.0000
E ho provato anche questo:
SELECT car_id, MAX(datetime) as datetime, lat, lon from table1
INNER JOIN table2 on carid = car_id
WHERE user = 'user1'
GROUP BY carid
ORDER BY datetime DESC;
Risultato:
carid datetime lat lon ------------------------------------------------------ A001 | 2013-25-06 10:10:00 | -23.0000 | -46.0000 A002 | 2013-25-06 10:02:00 | -24.3500 | -45.3200
Ma il risultato che ho ottenuto è sbagliato. Non so cosa fare senza selezionare tutte le righe, che è un modo più lento del modo in cui lo realizzo.
Qualche idea?
+1 per una domanda ben scritta con i dati della tabella e come si è tentato di risolvere il problema. – Taryn