2013-07-26 10 views
6

Sto cercando di tornare luoghi storici di un numero record diMYSQL Selezionare MAX Data all'interno di una join

Quello che ho è:

SELECT l.location, t.transaction_id, t.date_modified 
FROM transactions as t 
INNER JOIN (
SELECT 
t1.received_id, t1.transaction_id, t1.date_modified 
FROM (
SELECT received_id, MAX(date_modified) as maxmodify 
FROM transactions 
GROUP BY received_id) as max_record 
JOIN transactions as t1 
ON (t1.received_id =max_record.received_id) 
) as whatever 
INNER JOIN locations as l 
ON l.location_id = t.location_id 
INNER JOIN received as r 
ON r.received_id = t.received_id 
WHERE t.received_id='1782' 
ORDER BY t.date_modified DESC 

Questa operazione richiede circa 1 minuto per analizzare e restituisce i dati come:

T-E1A 67294 2013-05-29 14:05:30 
T-E1A 67293 2013-05-29 14:05:30 
T-E1A 67294 2013-05-29 14:05:30 
T-E1A 67293 2013-05-29 14:05:30 
T-E1A 67294 2013-05-29 14:05:30 
T-E1A 67293 2013-05-29 14:05:30 
T-E1A 67294 2013-05-29 14:05:30 

Quello che sto veramente in attesa di vedere i dati è come da una query come questa:

SELECT l.location, t.transaction_id, t.date_modified FROM transactions as t 
JOIN locations as l 
ON l.location_id = t.location_id 
JOIN received as r 
ON r.received_id = t.received_id 
WHERE t.received_id='1782' 
ORDER BY t.date_modified DESC 

che restituisce

T-E1A 67290 2013-05-29 13:58:26 
T-E1A 67289 2013-05-29 13:58:26 
ADJUST 67283 2013-04-26 11:33:54 
ADJUST 67284 2013-04-26 11:33:54 
ST10 67279 2013-04-26 09:52:41 
ST10 67278 2013-04-26 09:52:13 
ST10 67277 2013-04-26 09:50:58 
ST10 67276 2013-04-26 09:50:20 
SH3  67274 2013-04-26 09:49:39 

Questa seconda query è meglio, ma voglio davvero mostrare solo la data dell'ultima modifica per ogni record di id e la posizione.

Qualcuno può vedere cosa sto facendo male? Apprezzo l'aiuto.

risposta

10

qualcosa di simile ...

SELECT t1.received_id 
    , t1.transaction_id 
    , t1.date_modified 
    , l.location 
    FROM transactions t1 
    JOIN (SELECT received_id, MAX(date_modified) maxmodify FROM transactions GROUP BY received_id) max_record 
    ON max_record.received_id = t1.received_id 
    AND max_record.maxmodify = t1.date_modified 
    JOIN locations l 
    ON l.location_id = t1.location_id 
    JOIN received r 
    ON r.received_id = t1.received_id 
WHERE t1.received_id = '1782' 
ORDER 
    BY t1.date_modified DESC 

il nocciolo dei quali è questo ...

SELECT x.* 
    FROM my_table x 
    JOIN (SELECT id,MAX(thing) max_thing FROM my_table GROUP BY id) y 
    ON y.id = x.id 
    AND y.max_thing = x.thing; 
+0

Grazie, questa è la strada che ritengo più appropriata, ma ho problemi, come puoi vedere nella mia prima domanda, cercando di ottenere anche gli altri tavoli (posizioni, ricevuti). – nodsdorf

+0

Sì, è necessaria una clausola ON con ogni clausola JOIN – Strawberry

0
SELECT l.location, t.transaction_id, max(t.date_modified) FROM transactions as t 
JOIN locations as l 
ON l.location_id = t.location_id 
JOIN received as r 
ON r.received_id = t.received_id 
WHERE t.received_id='1782' 
group by l.location, t.transaction_id 
ORDER BY t.date_modified DESC 

Questo aiuto?

+0

ho inizialmente provato dal gruppo ma il problema è che ho bisogno di afferrare la data modificata e max il gruppo non lo consente. Grazie però – nodsdorf