Detaillierte Erklärung, warum MySQL nicht mit UNION zwei Abfragen verbinden kann

Detaillierte Erklärung, warum MySQL nicht mit UNION zwei Abfragen verbinden kann

Überblick

UNION

Mit dem Schlüsselwort „Verbindungsdatensatz“ können zwei Abfrageergebnissätze zu einem einzigen zusammengefügt werden, wobei identische Datensätze herausgefiltert werden.

UNION ALLE

Mit dem Schlüsselwort „Connection Dataset“ können zwei Abfrageergebnissätze zu einem zusammengefügt werden, ohne identische Datensätze herauszufiltern.

Als ich heute eine Anfrage erhielt, verwendete ich UNION zur Abfrage und stellte fest, dass zwei Abfragen, die jeweils mit ORDER BY verbunden wurden, nicht erfolgreich sortiert werden konnten. Nach viel Mühe habe ich es aufgezeichnet.

Tabellenstruktur und Daten

-- Tabelle erstellen CREATE TABLE test_user (
 ID int(11) NICHT NULL AUTO_INCREMENT,
 USER_ID int(11) DEFAULT NULL COMMENT 'Benutzerkonto',
 USER_NAME varchar(255) DEFAULT NULL COMMENT 'Benutzername',
 AGE int(5) DEFAULT NULL COMMENT 'Alter',
 COMMENT varchar(255) DEFAULT NULL COMMENT 'Einführung',
 PRIMÄRSCHLÜSSEL (ID)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
 
-- Dateneinfügungsanweisung INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', 'Glücklicher Neuling', '18', 'Heute sehr glücklich');
INSERT INTO test_user (ID, USER_ID, USER_NAME, ALTER, KOMMENTAR) VALUES ('2', '222', 'Trauriger Neuling', '21', 'Heute sehr traurig');
INSERT INTO test_user (ID, USER_ID, USER_NAME, ALTER, KOMMENTAR) VALUES ('3', '333', 'Ernsthafter Anfänger', '30', 'Heute sehr ernst');
INSERT INTO test_user (ID, USER_ID, USER_NAME, ALTER, KOMMENTAR) VALUES ('4', '444', 'Glücklicher Neuling', '18', 'Ich bin heute sehr glücklich');
INSERT INTO test_user (ID, USER_ID, USER_NAME, ALTER, KOMMENTAR) VALUES ('5', '555', 'Ernsthafter Anfänger', '21', 'Heute ist ein sehr ernster Tag');

Die Standardtabellendaten werden wie folgt angezeigt


Ausführen einer Ergebnisanalyse

-- Abfrage 1
WÄHLEN
 *
AUS
 test_benutzer u
NACH ALTER ORDNEN

Ergebnissatz 1


-- Abfrage 2
-- Verwenden von UNION
(
 WÄHLEN
  *
 AUS
  test_benutzer u
 NACH ALTER ORDNEN
)
UNION
(
 WÄHLEN
  *
 AUS
  test_benutzer u
 NACH ALTER ORDNEN
);
 
-- Abfrage 3
-- Verwenden von UNION ALL
(
 WÄHLEN
  *
 AUS
  test_benutzer u
 NACH ALTER ORDNEN
)
UNION ALLE
(
 WÄHLEN
  *
 AUS
  test_benutzer u
 NACH ALTER ORDNEN
)

Ergebnissatz 2: Verwenden von UNION

Da UNION identische Datensätze zusammenfasst (was dieselbe Wirkung hat wie DISTINCT), werden hier nur fünf Datensätze angezeigt.

Ergebnissatz 3: Verwenden von UNION ALL

Wenn Sie UNION ALL verwenden und sortieren müssen, müssen Sie es als Unterabfrage abfragen.

-- Abfrage 4
-- UNION ALL als Unterabfrage verwenden und SELECT sortieren
 *
AUS
 (
 (
 WÄHLEN
 *
 AUS
 test_benutzer u
 BESTELLEN BIS
 ALTER
 )
 UNION ALLE
 (
 WÄHLEN
 *
 AUS
 test_benutzer u
 BESTELLEN BIS
 ALTER
 )
 )
BESTELLEN BIS
 ALTER;

Ergebnissatz 4

verbessern

Nachdem ich nach relevanten Erfahrungen gesucht hatte, stellte ich fest, dass ich etwas Unnötiges getan hatte. Es stellte sich heraus, dass die Sortierung auch ohne Verwendung einer Unterabfrage durchgeführt werden kann:

-- Abfrage 5
-- Die erste Abfrage verwendet keine Sortierung. Wenn dies der Fall ist, wird ein Fehler ohne Klammern gemeldet (deshalb wollte ich vorher eine Unterabfrage verwenden und habe nicht an diese Methode gedacht)
WÄHLEN
 *
AUS
 test_benutzer u
 
UNION ALLE
 
WÄHLEN
 *
AUS
 test_benutzer u
BESTELLEN BIS
 ALTER

Der Ergebnisset ist derselbe wie Ergebnisset 4, daher wird das Ergebnis hier nicht eingefügt.

abschließend

Wenn wir die Anweisung UNION (oder UNION ALL) verwenden und die beiden Ergebnismengen von UNION separat sortiert und dann zusammengeführt werden, ist ihr ORDER BY ungültig. Wenn wir sortieren möchten, gibt es zwei Möglichkeiten:

  1. Verwende sie als Unterabfragen und frage sie erneut in ORDER BY ab (Methode 2 wird trotzdem empfohlen, da Unterabfragen nicht prägnant genug sind)
  2. Verwenden Sie keine Sortierung im ersten Ergebnissatz und keine Klammern, um die Ergebnisse zu trennen. Verwenden Sie ORDER BY nach dem zweiten Ergebnissatz.

Referenzlinks

cnblogs: Verwendung von UNION und UNION ALL in MySQL

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Lösung für das Problem mit dem MySQL-Sortierfehler

<<:  Detaillierte Erläuterung des Problems, dass die Synchronisierung des Warehouse-Cache nach dem Ändern der Yum-Quelle in CentOS8 fehlschlägt

>>:  Vue-Elternkomponente ruft Funktionsimplementierung der Unterkomponente auf

Artikel empfehlen

Ideen und Methoden zur inkrementellen Sicherung einer MySQL-Datenbank

Um eine inkrementelle Sicherung der MySQL-Datenba...

Lösungen für MySQL-Batch-Insert- und eindeutige Indexprobleme

MySQL-Batch-Einfügeproblem Da bei der Entwicklung...

Implementierung zum Erstellen benutzerdefinierter Images mit Dockerfile

Inhaltsverzeichnis Vorwort Einführung in Dockerfi...

React antd realisiert dynamische Vergrößerung und Verkleinerung der Form

Beim Schreiben dynamischer Formulare bin ich zuvo...

So passen Sie die Protokollebene von Nginx in Docker an

Inhaltsverzeichnis Einleitung Nginx-Dockerdatei N...

CSS3 erstellt eine Webanimation, um einen springenden Balleffekt zu erzielen

Grundlegende Vorbereitung Für diese Implementieru...

Verwendung der MySQL DATE_FORMAT-Funktion

Angenommen, Taobao animiert die Leute zum Einkauf...

So installieren Sie Babel mit NPM in VSCode

Vorwort Im vorherigen Artikel wurde die Installat...

Erklärung der Rückgabe einer MySQL-Tabelle führt zur Ungültigkeit des Index

Einführung Wenn die MySQL InnoDB-Engine Datensätz...

Zusammenfassung des MySQL Undo Log und Redo Log

Inhaltsverzeichnis Undo-Protokoll Erstellung und ...