Ich benutze Mysql und habe drei Tabellen T1, T2, T3 Sie enthalten Daten wie folgt:
+-------+
| t1.id |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
+-------+
| t2.id |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
+-------+
| t3.id |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
I want to be able to select data as follows:
id t1.id t2.id t3.id
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 null
5 5 null null
Wie kann ich das machen?
Antworten:
0 für die Antwort № 1SELECT t1.id, t2.id, t3.id
FROM t1
LEFT JOIN t2 ON t1.id=t2.id
LEFT JOIN t3 ON t1.id=t3.id
funktioniert, wenn t1
garantiert eine strikte Obermenge aller IDs.
Wenn nicht, benötigen Sie eine Hilfstabelle:
SELECT th.id,t1.id, t2.id, t3.id
FROM (
SELECT id FROM t1
UNION DISTINCT
SELECT id FROM t2
UNION DISTINCT
SELECT id FROM t3
) AS th
LEFT JOIN t1 ON th.id=t1.id
LEFT JOIN t2 ON th.id=t2.id
LEFT JOIN t3 ON th.id=t3.id
2 für die Antwort № 2
Vorausgesetzt, Sie beabsichtigen zu verwenden T1
als Basis id
, ein Paar LEFT JOIN
s gibt Ihnen das gewünschte Ergebnis:
SELECT
/* base id */
T1.id AS id,
/* Redundant t1.id */
T1.id AS t1_id,
T2.id AS t2_id,
T3.id AS t3_id
FROM
T1
LEFT JOIN T2 ON T1.id = T2.id
LEFT JOIN T3 ON T1.id = T3.id
Beachten Sie, dass dies redundant verwendet wird T1.id
, aber das ist genau das, was Sie in Ihrer vorgeschlagenen Ausgabe haben, also habe ich es hier kopiert.
Wenn Sie wirklich alle möglichen IDs aus allen Tabellen verwenden möchten, verwenden Sie a UNION
sich gegen anzuschließen Dadurch werden die verschiedenen IDs der drei Tabellen in einer Unterabfrage zusammengefasst allids
wird als Basis-ID verwendet LEFT JOIN
jeder der anderen drei Tabellen gegen. Wenn eine bestimmte ID in existiert T2
aber nicht T1
Dann wird es immer noch in der Ausgabe angezeigt.
SELECT
allids.id AS id,
T1.id AS t1_id,
T2.id AS t2_id,
T3.id AS t3_id
FROM
( SELECT id FROM T1 UNION SELECT id FROM T2 UNION SELECT id FROM T3 ORDER BY id) allids
LEFT JOIN T1 ON allids.id = T1.id
LEFT JOIN T2 ON allids.id = T2.id
LEFT JOIN T3 ON allids.id = T3.id
0 für die Antwort № 3
Ich denke, die Lösung, die Sie wollen, beinhaltet einen vollständigen äußeren Join:
SELECT coalesce(t1.id, t2.id, t3.id) as id,
T1.id as t1_id, T2.id as t2_id, T3.id as t3_id
FROM T1 full outer JOIN
T2 ON T2.id = T1.id full outer JOIN
T3 ON T3.id = coalesce(t1.id, t2.id)
Ich schlage den vollständigen Outer-Join vor, falls in den beiden anderen Tabellen IDs vorhanden sind, die nicht in T1 sind. Sie haben nicht angegeben, dass t1 der Fahrtisch ist.