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

Detaillierte Erläuterung des MySql-Beispiels für automatische Kürzung

Detaillierte Erläuterung des MySql-Beispiels für ...

Navicat kann keine Funktionslösungsfreigabe erstellen

Als ich zum ersten Mal eine MySQL-FUNKTION schrie...

JavaScript implementiert Ziehen mit der Maus, um die Div-Größe anzupassen

In diesem Artikel wird der spezifische JavaScript...

Detailliertes Beispiel für JavaScript-Array-Methoden

Inhaltsverzeichnis Einführung Erstellen eines Arr...

Spezifische Verwendung von Docker Anonymous Mount und Named Mount

Inhaltsverzeichnis Datenvolumen Anonyme und benan...

Das WeChat-Applet realisiert die Funktion zum Hochladen von Bildern

In diesem Artikelbeispiel wird der spezifische Co...

JS ES neue Funktionen Vorlagenzeichenfolge

Inhaltsverzeichnis 1. Was ist eine Vorlagenzeiche...