2013-07-26 7 views
6

próbuję powrócić zabytkowych miejsc rekordowa zaMYSQL wybierz MAX Data wewnątrz instrukcji przyłączenia

Co mam jest:

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 

To trwa około 1 min do analizowania i zwraca dane jak:

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 

Co ja naprawdę spodziewałem się zobaczyć jak to dane z kwerendy jak poniżej:

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 

Które zwraca

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 

To drugie zapytanie jest lepiej, ale naprawdę chcę tylko pokazać czas ostatniej modyfikacji dla każdego ID rekordu i lokalizacji.

Czy ktoś może zobaczyć, co robię źle? Doceniam pomoc.

Odpowiedz

10

Coś takiego ...

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 

jądro, które jest to ...

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

Dziękuję, że jest to najodpowiedniejsza trasa, ale mam problemy, jak można zobaczyć w pierwszym zapytaniu, próbując uzyskać połączenie także z innymi tabelami (lokalizacjami, odebranymi). – nodsdorf

+0

Tak, potrzebujesz klauzuli ON z każdą klauzulą ​​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 

Czy to pomaga?

+0

początkowo próbował grupę, ale problem jest muszę chwycić max zmodyfikowany i datę grupa nie pozwala na to. Dziękujemy jednak: – nodsdorf