2016-06-09 10 views
0

Ich versuche, zwei Tabellen in MySQL zu verbinden und nur eine Zeile anzuzeigen, die basierend auf einem Datumsfeld die neueste Zeile in der rechten Tabelle sein sollte.MySQL Join basiert auf der neuesten Zeile in der rechten Tabelle

Benutzer

id name 
1  John 
2  James 
3  Peter 

Orders

id user_id value order_date 
1  1   35  2016-06-01 
2  1   25  2016-06-05 
3  1   10  2016-06-07 
4  2   20  2016-06-02 
5  3   18  2016-06-07 

Erwartete Ausgabe

John 10 2016-06-07 
James 20 2016-06-02 
Peter 18 2016-06-07 

Abfrage

select 
    name, value, order_date 
from 
    users 
left join 
    orders on users.id = orders.user_id 

Received Ausgang

John 35 2016-06-01 
John 25 2016-06-05 
John 10 2016-06-07 
James 20 2016-06-02 
Peter 18 2016-06-07 

ich nicht Grenze 1 oder um die gesamte Abfrage, da dies nur eine Zeile Gesamt kehrt die nicht korrekt ist so hinzufügen kann einige, wie es in die hinzugefügt werden muss join aber ich kann nicht herausfinden, wie zu? Ich nehme eine Art Unterabfrage an, aber mache ich die Unterabfrage in der Auswahl oder der Verknüpfung oder beiden?

Antwort

0

Wenn Sie sicher sind, dass Sie nur 1 Datensatz pro User_id pro Tag haben

können Sie einfach MAX() auf diese Weise verwenden:

http://sqlfiddle.com/#!9/658ce/5

SELECT 
    name, 
    o.value, 
    o.order_date 
FROM users 
LEFT JOIN 
    (SELECT 
     user_id, 
     MAX(order_date) max_date 
    FROM orders 
    GROUP BY user_id 
) orders 
ON users.id = orders.user_id 
LEFT JOIN 
    orders o 
ON o.user_id = orders.user_id 
    AND orders.max_date = o.order_date 
+0

Guten Punkt - es könnte mehr als eine Größenordnung daher pro Tag pro Benutzer, warum ich um auf Datum dachte verwenden und dann könnte vielleicht id beispielsweise erforderlich sein, so ist es immer der neueste Eintrag. Es gibt keine andere Möglichkeit im Datensatz anzugeben, welche die aktuellste ist, da es sich um ein Datums- und kein Datetime-Feld handelt. – bhttoan

+0

Wenn Sie keine Spalte mit Datum-Uhrzeit haben, werden Sie nie sicher sein, welcher Datensatz * zuletzt ist * Das ist nur raten. manchmal ist 'id' nicht etwas solides, dem du vertrauen kannst. – Alex

0

Sie können so etwas wie dies versuchen:

select name, value, order_date 
from users 
left join orders o on users.id = o.user_id 
where not exists (
    select 1 
    from orders o2 
    where o2.user_id = o.user_id 
     and o2.id > o.id 
) 
0

Sie können in (su BQUERY für die max (order_date, user_id))

SELECT 
u.name 
, o.value 
, o.order_date 
from user as u 
inner join orders o on u.user_id = o.user_id 
and (o.user_id, o.order_date in (user_id, max(order_date) 
            from orders group by user_id)