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

Fehlereinfügungsanalyse der Funktion „updatexml()“ von MySQL

Verstehen Sie zunächst die Funktion updatexml() U...

Vue CodeMirror realisiert den Effekt des Online-Code-Compilers

Vorwort Wenn wir den Effekt der Online-Codekompil...

Ein- und Ausblenden von HTML-Elementen durch Anzeige oder Sichtbarkeit

Manchmal müssen wir steuern, ob HTML-Elemente auf ...

Analyse des MySQL-Sperrmechanismus und der Verwendung

Dieser Artikel veranschaulicht anhand von Beispie...

Spezifische Verwendung der MySQL-Vorbereitungsvorverarbeitung

Inhaltsverzeichnis 1. Vorverarbeitung 2. Vorbehan...

So reduzieren Sie die Bildgröße mithilfe des mehrstufigen Docker-Builds

In diesem Artikel wird beschrieben, wie Sie die m...

So implementieren Sie Datenpersistenz mit dem Vuex-Drittanbieterpaket

Zweck: Ermöglichen Sie die gleichzeitige lokale S...

Zusammenfassung zur Verwendung der Reduce()-Methode in JS

Inhaltsverzeichnis 1. Grammatik 2. Beispiele 3. A...

So installieren und konfigurieren Sie MySQL und ändern das Root-Passwort

1. Installation apt-get install mysql-server erfo...