MySQL
UNION
Suche…
Syntax
- UNION DISTINCT - Dedups nach dem Kombinieren der SELECTs
- UNION ALL - nicht deduziert (schneller)
- UNION - Die Standardeinstellung ist DISTINCT
- SELECT ... UNION SELECT ... - ist OK, aber bei
ORDER BY
mehrdeutig - (SELECT ...) UNION (SELECT ...) ORDER BY ... - löst die Mehrdeutigkeit auf
Bemerkungen
UNION verwendet nicht mehrere CPUs.
UNION * beinhaltet immer eine temporäre Tabelle, um die Ergebnisse zu sammeln. * Ab 5.7.3 / MariaDB 10.1 liefern einige Formen von UNION die Ergebnisse ohne Verwendung einer tmp-Tabelle (daher schneller).
SELECT-Anweisungen mit UNION kombinieren
Sie können die Ergebnisse von zwei identisch strukturierten Abfragen mit dem Schlüsselwort UNION
kombinieren.
Wenn Sie beispielsweise eine Liste aller Kontaktinformationen aus zwei separaten Tabellen, authors
und editors
möchten, können Sie das UNION
Schlüsselwort wie folgt verwenden:
select name, email, phone_number
from authors
union
select name, email, phone_number
from editors
Durch die Verwendung von union
werden Duplikate entfernt. Wenn Sie in Ihrer Abfrage Duplikate beibehalten müssen, können Sie das ALL
Schlüsselwort wie UNION ALL
: UNION ALL
.
SORTIEREN NACH
Wenn Sie die Ergebnisse einer UNION sortieren müssen, verwenden Sie dieses Muster:
( SELECT ... )
UNION
( SELECT ... )
ORDER BY
Ohne die Klammern würde das letzte ORDER BY zum letzten SELECT gehören.
Paginierung über OFFSET
Beim Hinzufügen eines LIMIT zu einer UNION ist dies das zu verwendende Muster:
( SELECT ... ORDER BY x LIMIT 10 )
UNION
( SELECT ... ORDER BY x LIMIT 10 )
ORDER BY x LIMIT 10
Da Sie nicht vorhersagen können, aus welchen SELECT (s) die "10" kommt, müssen Sie jeweils 10 davon erhalten und dann die Liste weiter unten durchlaufen, wobei sowohl ORDER BY
als auch LIMIT
wiederholt werden.
Für die 4. Seite von 10 Elementen wird dieses Muster benötigt:
( SELECT ... ORDER BY x LIMIT 40 )
UNION
( SELECT ... ORDER BY x LIMIT 40 )
ORDER BY x LIMIT 30, 10
Das heißt, sammeln Sie in jeder SELECT
4 Seitenwerte und führen Sie dann OFFSET
in der UNION
.
Daten mit unterschiedlichen Spalten kombinieren
SELECT name, caption as title, year, pages FROM books
UNION
SELECT name, title, year, 0 as pages FROM movies
Wenn Sie zwei Datensätze mit unterschiedlichen Spalten kombinieren, dann emulieren Sie die fehlenden mit Standardwerten.
UNION ALL und UNION
SELECT 1,22,44 UNION SELECT 2,33,55
SELECT 1,22,44 UNION SELECT 2,33,55 UNION SELECT 2,33,55
Das Ergebnis ist das gleiche wie oben.
Verwenden Sie UNION ALL
wann
SELECT 1,22,44 UNION SELECT 2,33,55 UNION ALL SELECT 2,33,55
Kombinieren und Kombinieren von Daten in verschiedenen MySQL-Tabellen mit denselben Spalten in eindeutigen Zeilen und Ausführen der Abfrage
Dieses UNION ALL-System kombiniert Daten aus mehreren Tabellen und dient als Tabellennamensalias für Ihre Abfragen:
SELECT YEAR(date_time_column), MONTH(date_time_column), MIN(DATE(date_time_column)), MAX(DATE(date_time_column)), COUNT(DISTINCT (ip)), COUNT(ip), (COUNT(ip) / COUNT(DISTINCT (ip))) AS Ratio
FROM (
(SELECT date_time_column, ip FROM server_log_1 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log_2 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log_3 WHERE state = 'action' AND log_id = 150) UNION ALL
(SELECT date_time_column, ip FROM server_log WHERE state = 'action' AND log_id = 150)
) AS table_all
GROUP BY YEAR(date_time_column), MONTH(date_time_column);