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

Detaillierte Schritte zur Installation von MySql 5.7.21 unter Linux

Vorwort Die am häufigsten verwendete Datenbank in...

Beispiele für optimistisches und pessimistisches Sperren in MySQL

Die Aufgabe der Parallelitätskontrolle in einem D...

So behandeln Sie den vom Linux-System gemeldeten Fehler tcp_mark_head_lost

Problembeschreibung Kürzlich meldete ein Host die...

Die Vollversion des gängigen Linux-Tools vi/vim

Warum Vim lernen? Linux verfügt über eine große A...

Sie müssen wahrscheinlich keine Switch-Anweisungen in JavaScript verwenden

Inhaltsverzeichnis Kein Schalter, keine komplexen...

Detaillierte Erklärung der Interaktion zwischen React Native und IOS

Inhaltsverzeichnis Voraussetzungen RN übergibt We...

Beispiel für eine MySQL-DML-Sprachoperation

Zusätzliche Erklärung, Fremdschlüssel: Verwenden ...

Vue implementiert die Produktregisterkarte der Produktdetailseitenfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Beispiel für die horizontale Anordnung von li-Tags in HTML

Die meisten Navigationsleisten sind horizontal an...

Beispiel für die gemeinsame Nutzung von Anker-Tags in HTML

Verwendung von Anker-Tags: Als Ankerlink wird ein ...