Sie müssen genannt einen SQL-Operator verwenden JOIN zu bekommen, was Sie wollen.
JOIN ist ein grundlegender Teil der SQL-Sprache, genauso wie eine while-Schleife für andere Programmiersprachen.
starten hier: A Visual Explanation of SQL Joins
Eine andere Denkweise vs. UNION JOIN ist:
- UNION anhängt zusammen Reihen.
- JOIN fügt Spalten zusammen an.
Zum Beispiel:
SELECT *
FROM table1
JOIN table2 USING (id);
Dies ist eine Art der Verknüpfung, die gibt nur die Zeilen, für die eine passende ID in beiden Tabellen vorhanden ist. Aber Sie wollen alle diese IDs, für die eine Zeile in mindestens einer Tabelle existiert.
SELECT *
FROM table1
LEFT OUTER JOIN table2 USING (id);
Dies wird alle Zeilen von Tabelle 1, mit ihren passenden Zeilen in table2. Aber das Gegenteil zu bekommen, würden wir brauchen:
SELECT *
FROM table1
RIGHT OUTER JOIN table2 USING (id);
SQL definiert auch eine FULL OUTER JOIN, die beide auf einmal tun würde, aber leider hat MySQL nicht, dass ein Teil der SQL-Standards implementiert. Aber wir können UNION
verwenden, um die beiden Arten von Joins zu kombinieren. Union löscht standardmäßig doppelte Zeilen.
update: Ich habe das Problem, und habe es zur Arbeit. Es stellt sich heraus, dass Sie die Spalten explizit benennen müssen, um sicherzustellen, dass sie sich in den beiden unionierten Abfragen in denselben Spalten befinden. Hier ist die Abfrage, die, kopiert von meinen Terminal-Fenstern funktioniert:
SELECT id, name, state
FROM table1
LEFT OUTER JOIN table2 USING (id)
UNION
SELECT id, name, state
FROM table1
RIGHT OUTER JOIN table2 USING (id);
Es ist eine gute Gewohnheit im Allgemeinen zu vermeiden, mit SELECT *
, und dies ist nur ein weiterer Fall, in dem es ist eine gute Idee.
Auch hatte ich im Abfrage-Beispiel zuvor ein überflüssiges Semikolon hinterlassen. Das war nur ein Tippfehler meinerseits.
Diese Abfrage erzeugt die folgende Ausgabe, von meinem Terminal-Fenster kopiert:
+----+------+-------+
| id | name | state |
+----+------+-------+
| 1 | alan | NULL |
| 2 | bob | MI |
| 3 | dave | WV |
| 4 | NULL | FL |
+----+------+-------+
PS: Danke, dass Sie so klar die Frage zu fragen!
Sehr gute Demonstration und Definition des Problems 1 – SaidbakR