2016-06-29 9 views
1

Ich möchte zwei Tabellen für ID-Spalten verbinden, wobei die ID in Tabelle1 eindeutig ist, aber wiederholt oder in Tabelle2 nicht vorhanden sein kann. In Tabelle 2 möchte ich eine zweite Spalte (Datum) verwenden, um das größte Datum auszuwählen, das kleiner ist als das Datum, das dem Datum in der Zeile Tabelle1 entspricht. Ich muss aus der Tabelle zusätzliche Spalten auszuwählen 2.MySQL korrierte Unterabfrage mit WHERE-Klausel, die äußere Abfrage referenziert

Die Abfrage ich habe, ist:

SELECT * FROM `t1` LEFT JOIN 
(SELECT `t2`.`other_column`, MAX(`t2`.`date`) FROM `t2` GROUP BY `t2`.`id` WHERE `t2`.`date`<`t1`.`date`) 
ON `t1`.`id` = `t2`.`id` 

Das Problem ist, dass Sie nicht t1 Variablen in der WHERE-Klausel der der t2 Unterabfrage verwenden können.

Danke,

+0

können Sie nach Beispieldaten und gewünschtes Ergebnis einschließlich Ihrer Tabellenstruktur –

Antwort

2

können Sie tun, was Sie mit einer korrelierten Unterabfrage wollen in der wählen Klausel:

SELECT t1.* 
     (SELECT MAX(t2.date) 
     FROM t2 
     WHERE t2.id = t1.id AND t2.date < t1.date 
     ) as t2date 
FROM t1 ; 
+0

Ihre Antwort auf die Frage ist vor Ort auf, fragte ich, aber ich würde es für stark vereinfacht, was ich brauchte. Ist es möglich, mehrere Spalten in der Unterabfrage auszuwählen, anstatt nur eine? – Dom

+0

@Dom. . . Kannst du eine andere Frage stellen? –

2

EDIT: Misunderstood Frage. In diesem Fall benötigen Sie eine Unterabfrage.

SELECT * FROM t1 
INNER JOIN 
(
    SELECT id, MAX(t2.date) AS `date` FROM t2 GROUP BY id 
) t3 ON (t3.id = t1.id AND t3.date < t1.date) 
+0

Dies gibt eine Zeile und nicht eine Zeile pro ID zurück. –

+0

Ah, ich habe die Frage falsch verstanden. Lass mich nochmal schauen, ob es mit einer ähnlichen Methode angepasst werden kann. – SArnab

+0

Die Bearbeitung beantwortet meine Frage nicht. Die Unterabfrage wählt das maximale Datum für jede ID aus, dann wählt die ON-Klausel nur Zeilen aus, bei denen das absolute maximale Datum für eine ID in t2 kleiner als das Datum in t1 ist. Was ich suche, ist das größte Datum für ein in t2, das kleiner ist als das Datum in t1. – Dom

0

Stellt sich heraus, dass die Unterabfrage ein Red Hering war und ich alles ohne es tun könnte.

SELECT `t1`.*, `t2`.*, MAX(`t2`.`date`) FROM `t1` 
LEFT JOIN `t2` 
ON (`t1`.`id`=`t2`.`id` AND `t2`.`date`<`t1`.`date`) 
GROUP BY `t1`.`id`