Grundlegende MySQL-Tabellenabfragen – häufige Fehler beim Left-Join

Grundlegende MySQL-Tabellenabfragen – häufige Fehler beim Left-Join

Überblick

Bei kleinen und mittelgroßen Projekten ist die gemeinsame Tabellenabfrage ein sehr gängiger Vorgang, insbesondere beim Erstellen von Berichten. Sind Ihnen beim Korrekturlesen der Daten dennoch Fallstricke aufgefallen? In diesem Artikel werden typische Fehlerquellen bei häufig verwendeten gemeinsamen Tabellenabfragen in MySQL beschrieben.

Grundlegende Umgebung

Anweisung „Tabelle erstellen“

DROP TABLE, WENN `Rolle` EXISTIERT;
CREATE TABLE `Rolle` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `role_name` VARCHAR(50) DEFAULT NULL COMMENT 'Rollenname',
 PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Rollentabelle';


in „Rolle“ einfügen VALUES(1, „Administrator“);
in „Rolle“ einfügen VALUES(2, „General Manager“);
in „Rolle“ einfügen VALUES(3, „Abteilungsleiter“);
in „Rolle“ einfügen VALUES(4, „Teamleiter“);

DROP TABLE, WENN `Benutzer` EXISTIERT;
CREATE TABLE `Benutzer` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `role_id` int(11) NOT NULL COMMENT 'Rollen-ID',
 `user_name` VARCHAR(50) DEFAULT NULL COMMENT 'Benutzername',
 `sex` int(1) DEFAULT 0 COMMENT 'Geschlecht',
 PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Benutzertabelle';

in „Benutzer“ einfügen VALUES(1, 1, „admin“, 1);
in „Benutzer“ einfügen VALUES(2, 2, „Manager Wang“, 1);
in „Benutzer“ einfügen VALUES(3, 2, „Manager Li“, 2);
in „Benutzer“ einfügen VALUES(4, 2, „Manager Zhang“, 2);
in „Benutzer“ einfügen VALUES(5, 3, „Abteilungsleiter Wang“, 1);
in „Benutzer“ einfügen VALUES(6, 3, „Abteilungsleiter Li“, 1);
in „Benutzer“ einfügen VALUES(7, 3, „Lv Section Chief“, 2);
in „Benutzer“ einfügen VALUES(8, 3, „Abteilungsleiter Xing“, 1);
in „Benutzer“ einfügen VALUES(9, 4, „Team Leader Fan“, 2);
in „Benutzer“ einfügen VALUES(10, 4, „Teamleiter Zhao“, 2);
in „Benutzer“ einfügen VALUES(11, 4, „Ji Team Leader“, 1);

Die Daten sind wie folgt

mysql> wähle * aus Rolle;
+----+-----------+
| ID | Rollenname |
+----+-----------+
| 1 | Administrator |
| 2 | Geschäftsführer|
| 3 | Abteilungsleiter |
| 4 | Teamleiter|
+----+-----------+
4 Zeilen im Satz (0,00 Sek.)

mysql> wähle * vom Benutzer aus;
+----+---------+--------------+------+
| ID | Rollen-ID | Benutzername | Geschlecht |
+----+---------+--------------+------+
| 1 | 1 | Administrator | 1 |
| 2 | 2 | Leiter Wang | 1 |
| 3 | 2 | Leiter Li | 2 |
| 4 | 2 | Leiter Zhang | 2 |
| 5 | 3 | Abteilungsleiter Wang | 1 |
| 6 | 3 | Abteilungsleiter Li | 1 |
| 7 | 3 | Abteilungsleiter Lu | 2 |
| 8 | 3 | Sektionsleiter Xing | 1 |
| 9 | 4 | Teamleiter-Fan | 2 |
| 10 | 4 | Teamleiter Zhao | 2 |
| 11 | 4 | Teamleiter Ji | 1 |
+----+---------+--------------+------+
11 Zeilen im Satz (0,00 Sek.)

Basisgeschäft

Einfacher Informationsbericht: Benutzerinformationen abfragen

mysql> AUSWÄHLEN
  -> Ich würde,
  -> Benutzername AS 'Name',
  -> (FALL, WENN Geschlecht = 1, DANN ‚Männlich‘, WENN Geschlecht = 2, DANN ‚Weiblich‘, SONST ‚Unbekannt‘, ENDE) ALS ‚Geschlecht‘
  -> VON
  -> BENUTZER;
+----+-----------+--------+
| ID | Name | Geschlecht |
+----+-----------+--------+
| 1 | Administrator | Männlich |
| 2 | Manager Wang | Männlich |
| 3 | Managerin Li | Weiblich |
| 4 | Manager Zhang | Weiblich |
| 5 | Abteilungsleiter Wang | Männlich |
| 6 | Abteilungsleiter Li | Männlich |
| 7 | Abteilungsleiterin Lu | Weiblich |
| 8 | Abteilungsleiter Xing | Männlich |
| 9 | Teamleiter Fan | Weiblich |
| 10 | Teamleiterin Zhao | Weiblich |
| 11 | Ji Teamleiter | Männlich |
+----+-----------+--------+

Abfrage des Namens jeder Rolle und der Anzahl der Frauen im entsprechenden Personal

mysql> AUSWÄHLEN
  -> r.id,
  -> r.role_name AS-Rolle,
  -> zähle( u.sex ) ALS Geschlecht
  -> VON
  -> Rolle r
  -> LINKS BEITRETEN BENUTZER u ON r.id = u.role_id
  -> UND u.sex = 2
  -> GRUPPE NACH
  -> r.Rollenname
  -> BESTELLEN NACH
  -> r.id ASC;
+----+-----------+-----+
| Ich | Rolle | Geschlecht |
+----+-----------+-----+
| 1 | Administrator | 0 |
| 2 | Geschäftsführer | 2 |
| 3 | Abteilungsleiter | 1 |
| 4 | Teamleiter | 2 |
+----+-----------+-----+
4 Zeilen im Satz (0,00 Sek.)

Was passiert, wenn wir die Filterbedingung für das Geschlecht in eine Where-Operation ändern?

mysql> AUSWÄHLEN
  -> r.id,
  -> r.role_name AS-Rolle,
  -> zähle( u.sex ) ALS Geschlecht
  -> VON
  -> Rolle r
  -> LINKS BEITRETEN BENUTZER u ON r.id = u.role_id
  -> WO
  -> u.sex = 2
  -> GRUPPE NACH
  -> r.Rollenname
  -> BESTELLEN NACH
  -> r.id ASC;
+----+-----------+-----+
| Ich | Rolle | Geschlecht |
+----+-----------+-----+
| 2 | Geschäftsführer | 2 |
| 3 | Abteilungsleiter | 1 |
| 4 | Teamleiter | 2 |
+----+-----------+-----+
3 Zeilen im Satz (0,00 Sek.)

Hier sieht man, dass die Charakterdaten unvollständig sind.

Finden Sie die Anzahl der Mitarbeiter mit der Rolle des General Managers

mysql> AUSWÄHLEN
  -> r.id,
  -> r.role_name AS-Rolle,
  -> zähle( u.sex ) ALS Geschlecht
  -> VON
  -> Rolle r
  -> LINKS BEITRETEN BENUTZER u ON r.id = u.role_id
  -> WO
  -> r.role_name = 'Generaldirektor'
  -> GRUPPE NACH
  -> r.Rollenname
  -> BESTELLEN NACH
  -> r.id ASC;
+----+-----------+-----+
| Ich | Rolle | Geschlecht |
+----+-----------+-----+
| 2 | Geschäftsführer | 3 |
+----+-----------+-----+
1 Zeile im Satz (0,00 Sek.)

Ändern Sie auch die Filterbedingung von wo nach wo

mysql> AUSWÄHLEN
  -> r.id,
  -> r.role_name AS-Rolle,
  -> zähle( u.sex ) ALS Geschlecht
  -> VON
  -> Rolle r
  -> LINKS BEITRETEN BENUTZER u ON r.id = u.role_id
  -> UND r.role_name = 'General Manager'
  -> GRUPPE NACH
  -> r.Rollenname
  -> BESTELLEN NACH
  -> r.id ASC;
+----+-----------+-----+
| Ich | Rolle | Geschlecht |
+----+-----------+-----+
| 1 | Administrator | 0 |
| 2 | Geschäftsführer | 3 |
| 3 | Abteilungsleiter | 0 |
| 4 | Teamleiter | 0 |
+----+-----------+-----+
4 Zeilen im Satz (0,00 Sek.)

Hier sieht man, dass die Daten redundant sind.

Zusammenfassen

In der linken Join-Anweisung muss der linke Tabellenfilter in die Where-Bedingung und der rechte Tabellenfilter in die On-Bedingung gesetzt werden, damit das Ergebnis genau richtig ist und weder zu viel noch zu wenig.

Damit ist dieser Artikel über die üblichen Fallstricke von Left-Join, einer grundlegenden Operation von MySQL-Join-Tabellenabfragen, abgeschlossen. Weitere relevante Inhalte zu MySQL-Join-Tabellenabfragen mit Left-Join finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Analyse einfacher Anwendungsbeispiele für abgeleitete MySQL-Tabellen (abgeleitete Tabellen)
  • Ein einfaches Beispiel für eine gemeinsame MySQL-Tabellenabfrage
  • Optimierungsmethode für verschachtelte MySQL-Abfragen und gemeinsame Tabellenabfragen
  • Syntaxeinführung zum Aktualisieren und Löschen gemeinsamer Tabellen in MySQL
  • Tatsächlicher Prozess der Abfrage abgeleiteter Tabellen in MySQL

<<:  Detaillierte Erläuterung zum Hinzufügen von Sicherheitsgruppenregeln zum Alibaba Cloud Server (grafisches Tutorial)

>>:  Verwenden von js, um den Effekt eines Karussells zu erzielen

Artikel empfehlen

Detailliertes Tutorial zum Ausführen von Selenium+Chromedriver auf dem Server

1. Einleitung Ich möchte Selenium verwenden, um D...

Tutorial zu HTML-Tabellen-Tags (11): Horizontales Ausrichtungsattribut ALIGN

In horizontaler Richtung können Sie die Ausrichtu...

Docker-Dateispeicherpfad, Port-Mapping-Betriebsmodus ändern

So erhalten Sie den Container-Startbefehl Der Con...

Ein super detailliertes Vue-Router Schritt-für-Schritt-Tutorial

Inhaltsverzeichnis 1. Router-Ansicht 2. Router-Ve...

So konfigurieren Sie Nginx zur Unterstützung von IPv6 unter Linux

1. Überprüfen Sie, ob das vorhandene Nginx IPv6 u...

Lösung für den internen Serverfehler Nginx 500

Als ich heute Nginx verwendete, trat ein 500-Fehl...

Tutorial zur Verwendung des Frameset-Tags in HTML

Frameset-Seiten unterscheiden sich etwas von norm...

Tipps zum reflektierenden Lernen von JavaScript

Inhaltsverzeichnis 1. Einleitung 2. Schnittstelle...

Lösen Sie das Problem der Kombination von AND und OR in MySQL

Wie unten dargestellt: Wählen Sie Produktname, Pr...