/ / Auswahl ungleicher Spalten aus verschiedenen Tabellen in mysql - mysql

Auswahl ungleicher Spalten aus verschiedenen Tabellen in mysql - mysql

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 № 1
SELECT 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 JOINs 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.