2017-01-02 5 views
1

Ich verwende die folgende Abfrage, um den letzten Datensatz eines Benutzers zu erhalten.Verknüpfen Sie eine SQL-Abfrage mit einer anderen Tabelle

SELECT t1.username, t1.value, t1.date 
FROM table t1 
JOIN (select username, max(date) as maxdate from table 
     group by username) t2 on t1.username = t2.username 
          and t1.date = t2.maxdate 
WHERE t1.date >= CURDATE() 
ORDER BY t1.date DESC 

Sein eine Tabelle mit folgenden Struktur Rückkehr

------------------------ 
username | value | date 
------------------------ 

Ich habe eine andere Tabelle (T3) die Struktur folgenden

---------------------------- 
username | category | group 
---------------------------- 

Wie kann ich ein ähnliches Ergebnis wie folgenden Tabellenstruktur erhalte

------------------------------------------- 
username | value | date | category | group 
------------------------------------------- 

Wie kann man diese Beziehungen verbinden?

Antwort

4

Sie können den follwing Weg JOIN:

SELECT t1.username, t1.value, t1.date, t3.category, t3.group 
FROM table t1 
JOIN (select username, max(date) as maxdate from table 
     group by username) t2 on t1.username = t2.username 
          and t1.date = t2.maxdate 
JOIN table3 t3 ON t3.username=t1.username 
WHERE t1.date >= CURDATE() 
ORDER BY t1.date DESC 

Hinweis: Ich weiß mysql nicht, aber ich denke, es ist das gleiche in MS SQL ist.

3

Obwohl eine direkte join der effektivste und schnellste Weg ist, wenn Sie eine Operation wie max(date) auf Ihrer t1 select-Anweisung (wie in Ihrem t2 select) ausführen, könnten Sie die Abfrage in ähnlicher Weise wie erstellen Sie haben auf der t2 SELECT-Abfrage durchgeführt:

SELECT maintable.username, maintable.value, maintable.date, secondtable.category, secondtable.group 
FROM (
    SELECT t1.username, t1.value, t1.date 
    FROM table t1 
    JOIN (select username, max(date) as maxdate from table 
      group by username) t2 on t1.username = t2.username 
           and t1.date = t2.maxdate 
    WHERE t1.date >= CURDATE() 
    ORDER BY t1.date DESC 
    ) maintable 
JOIN table secondtable ON maintable.username = secondtable.username 

Beachten Sie, dass dies in keiner Weise die beste Option, wenn Sie nicht eine Operation auf der inneren wählen zu schaffen.

+0

Danke für Ihre Lösung. Aber irgendwie ist seine Leistung nicht auf dem neuesten Stand. Siehe Andre's Antwort. Ich habe die beiden ausprobiert. Ihre Abfrage wurde in 24.03 Sekunde auf meinem Server zurückgegeben. Im Gegensatz dazu kam Andre's Query in 2,46 Sekunden zurück. Obwohl ich danke, –

+1

ich stimme zu, ist diese Lösung nicht leistungsorientiert. –

Verwandte Themen