Detaillierte Erläuterung mehrerer Implementierungsmethoden des MySQL-Zählens nach Bedingungen

Detaillierte Erläuterung mehrerer Implementierungsmethoden des MySQL-Zählens nach Bedingungen

Ich habe vor Kurzem eine Reihe statistischer Funktionen zum Backend einer bestimmten Website hinzugefügt und bin dabei auf viele Situationen gestoßen, in denen ein Zählen nach Bedingungen erforderlich war. Ich habe mehrere Methoden ausprobiert und sie unten zu Ihrer Information kurz aufgezeichnet.

Problembeschreibung

Um die Diskussion verständlicher zu machen, habe ich das Problem etwas vereinfacht und viele Hintergründe entfernt.

Es war einmal ein Kaiser, der hatte 50 Konkubinen. Diese Konkubinen gebar ihm zu Unrecht 100.000 Söhne. Der Kaiser war sehr verzweifelt. Es war schwierig, eine so große Zahl von Söhnen zu verwalten. Außerdem wollte er wissen, wie viele Söhne jede Konkubine geboren hatte, damit er sie entsprechend ihrer Verdienste belohnen konnte. Dies war sehr schwierig. Also stellte der Kaiser einen Programmierer ein, der ihm helfen sollte, ein Programm zu schreiben, mit dem die Informationen aller seiner Söhne in einer Datenbank gespeichert werden konnten, sodass er sie mit dem Programm zählen und verwalten konnte.

Die Datenbank hat folgende Struktur:

Ausweis Die einzigartige Nummer des Prinzen
Mutter Die einzigartige Nummer der Mutter des Prinzen

Der Kaiser teilte seine Konkubinen in zwei Ebenen ein: die Konkubinen im Himmlischen Palast (Anzahl kleiner als 25) und die Konkubinen im Unterirdischen Palast (Anzahl größer oder gleich 25). Er wollte wissen, welche von ihnen fruchtbarer war, die Konkubinen im Himmlischen Palast oder die Konkubinen im Unterirdischen Palast. Also begannen Programmierer, SQL-Abfragen zu schreiben.

Methode 1: Verwenden von GROUP BY

SQL-Abfrage

SELECT COUNT(*) FROM `prince` GROUP BY `mother` > 24;

Ausführungsergebnisse

zählen(*)
50029
49971

Laufzeit bei 100.000 Zeilen: 0,0335 Sekunden

analysieren

Das größte Problem bei diesem GROUP BY-Ansatz besteht darin, dass es unmöglich ist, die erzielten Ergebnisse zu unterscheiden. Welche dieser beiden Zahlen ist die Anzahl der Prinzen, die den Damen im Himmlischen Palast geboren wurden, und welche ist die Anzahl der Prinzen, die den Damen im Unterirdischen Palast geboren wurden? habe keine Ahnung. Obwohl es also eine Gesamtsumme ergibt, ist es bedeutungslos.

Um die statistischen Ergebnisse unterscheiden zu können, muss die Bedingung „Mutter > 24“ daher auch als Feld im Ergebnissatz wiedergegeben werden. Das modifizierte SQL lautet wie folgt:

SELECT COUNT(*) AS `number`, `mother` > 24 AS `type` FROM `prince` GROUP BY `mother` > 24;

Ausführungsergebnisse

Nummerntyp
50029 0
49971 1

Wenn der bedingte Ausdruck als Feld verwendet wird, ist der Wert des Felds der Wert des bedingten Ausdrucks. Daher bedeutet in unserem Beispiel Typ = 1, dass der Wert von Mutter > 24 1 ist. Daher stellen die Zahlen in der zweiten Zeile die Anzahl der Prinzen dar, die den Damen im unterirdischen Palast geboren wurden.

Nach den Änderungen können wir sehen, dass die Göttinnen im himmlischen Palast etwas besser sind.

Für und Wider

Die Nachteile liegen auf der Hand. Da bedingte Ausdrücke als Grundlage für die Gruppierung verwendet werden, können nur binäre Unterteilungen vorgenommen werden. Dies ist nicht für Situationen geeignet, in denen mehrere Kategorien aus statistischen Gründen unterteilt werden müssen. Beispielsweise wäre es unmöglich, die Anzahl der Kinder zu zählen, die von den Konkubinen Nr. 1 bis 10, Nr. 11 bis 24 und Nr. 25 bis 50 geboren wurden.

Da GROUP BY verwendet wird, ist außerdem eine Sortierung erforderlich und die Ausführungszeit ist länger.

Ich habe bei diesem Ansatz bisher keine Vorteile entdeckt.

Methode 2: Verwenden von verschachtelten SELECT

Das Ziel kann auch durch die Verwendung verschachtelter SELECTs erreicht werden, indem die Daten unter einer Bedingung in jeder SELECT-Klausel gezählt werden und diese statistischen Daten dann in ein Haupt-SELECT integriert werden.

SQL-Abfrage

WÄHLEN 
  ( SELECT COUNT( * ) FROM `Prinz` WHERE `Mutter` >24 ) AS `Digong`, 
  ( SELECT COUNT( * ) FROM ‚Prinz‘ WHERE ‚Mutter‘ <=24 ) AS ‚tiangong‘

Ausführungsergebnisse

digong tiangong
49971 50029

Laufzeit bei 100.000 Zeilen: 0,0216 Sekunden

analysieren

Diese verschachtelte SELECT-Methode ist sehr intuitiv. Sie zählt die Werte unter jeder Bedingung separat und fasst sie am Ende zusammen. Sie ist leicht zu verstehen und unterscheidet sich nicht von natürlicher Sprache.

Für und Wider

Der Vorteil ist, dass es intuitiv und schneller als GROUP BY ist. Obwohl es drei SELECT-Anweisungen gibt, also zwei mehr als bei der GROUP BY-Lösung, erfolgt keine Sortierung, was viel Zeit spart.

Der Nachteil kann darin bestehen, dass es zu viele Sätze gibt, und Schüler, die von der Anzahl der Sätze besessen sind, fühlen sich möglicherweise unwohl.

Methode 3: Verwenden von CASE WHEN

Die CASE WHEN-Anweisung ist sehr leistungsfähig und kann flexible Abfragebedingungen definieren, weshalb sie sich sehr gut für Klassifizierungsstatistiken eignet.

SQL-Abfrage

WÄHLEN 
  ZÄHLEN (FALL, WENN „Mutter“ >24, DANN 1, SONST NULL, ENDE) ALS „Digong“, 
  ZÄHLEN (FALL, WENN „Mutter“ <= 24, DANN 1, SONST NULL, ENDE) ALS „tiangong“
VON Prinz

Ausführungsergebnisse

digong tiangong
49971 50029

Laufzeit für 100.000 Zeilen: 0,02365825 Sekunden

analysieren

Der Schlüssel zu dieser Methode ist

COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END )

Hier werden COUNT und CASE WHEN zusammen verwendet, um kategorisches Zählen zu erreichen. Verwenden Sie zunächst CASE WHEN. Wenn die Bedingung erfüllt ist, setzen Sie den Feldwert auf 1. Wenn die Bedingung nicht erfüllt ist, setzen Sie den Feldwert auf NULL. Dann zählt die Funktion COUNT nur noch Felder, die nicht NULL sind. Dann ist das Problem gelöst.

Für und Wider

Der Vorteil dieser Methode besteht darin, dass keine Sortierung erforderlich ist. Die Ausführungszeit ist daher mit der von Methode 2 vergleichbar und die Anzahl der SELECT-Anweisungen wird auf 1 reduziert.

Der Nachteil besteht darin, dass die Sätze relativ lang sind und sich Schüler, die auf die Satzlänge fixiert sind, möglicherweise unwohl fühlen.

Zusammenfassen

Versuchen Sie beim bedingten Zählen bestimmter Kategorien, GROUP BY nicht zu verwenden, um das Sortieren zu vermeiden und die Ausführung der Abfrage zu beschleunigen.

Wenn Sie basierend auf dem Wert eines Felds klassifizieren müssen und der Wert des Felds variabel ist, möchte der Kaiser beispielsweise die Anzahl der Kinder zählen, die jede Konkubine zur Welt bringt, und er heiratet möglicherweise viele Konkubinen. In diesem Fall ist die Verwendung der Methoden 2 und 3 nicht sehr effektiv. Einfacher und bequemer ist die Verwendung von GROUP BY.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Zwei Methoden zur Implementierung der MySQL-Gruppenzählung und Bereichsaggregation
  • Detaillierte Erläuterung von MySQL zum Abrufen statistischer Daten für jeden Tag und jede Stunde eines bestimmten Zeitraums
  • Zusammenfassung der MySQL-Zeitstatistikmethoden
  • mysql erhält statistische Daten innerhalb eines bestimmten Zeitraums
  • Implementierung leistungsstarker und gleichzeitig nutzbarer Zählerlösungen in MySQL (z. B. Artikel-Klickzähler)
  • Mysql auto_increment-Neuzählung (ID bei 1 beginnen lassen)
  • Detaillierte Erklärung des Prozesses zum Erstellen eines Zählers mit PHP und MySQL

<<:  Detailliertes Tutorial zur Installation von InfluxDB in Docker (Leistungstest)

>>:  Detaillierte Erläuterung des Prozesses zum Einrichten einer NVIDIA-Docker-Umgebung auf einem Linux-Server

Artikel empfehlen

Lernen Sie, mit Eclipse eine Verbindung zur MySQL-Datenbank herzustellen

Vorwort Da immer wieder Fehler auftreten, protoko...

So versuchen Sie, Ihrem CSS einen Sticky-Effekt hinzuzufügen

Vorne geschrieben Ich weiß nicht, wer als Erster ...

Beispielcode zum Installieren der ASPNET.Core3.0-Runtime unter Linux

# Die folgenden Beispiele gelten für die x64-Bit-...

Bedingte Kommentare zur Bestimmung des Browsers (IE-Reihe)

<!--[if IE 6]> Nur IE6 kann erkennen <![e...

Erläuterung der Zusammenführung von TypeScript-Namespaces

Inhaltsverzeichnis Namespaces mit gleichem Namen ...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.22 winx64

Das grafische Tutorial zur Installation und Konfi...

Allgemeine Lösungen für das Ablaufen der Lese-/Schreibtrennung in MySQL

Die Fallstricke der Lese- und Schreibtrennung in ...

So aktivieren Sie die MySQL-Remoteverbindung auf einem Linux-Server

Vorwort Lernen Sie MySQL, um frühere Nicht-MK-Dat...

JavaScript zum Erreichen einer festen Seitenleiste

Verwenden Sie Javascript, um eine feste Seitenlei...

Eine kurze Analyse des Funktionsaufrufprozesses unter der ARM-Architektur

Inhaltsverzeichnis 1. Hintergrundwissen 1. Einfüh...

Detaillierte Erklärung des HTML-Bereichs-Tags

Der <area>-Tag definiert einen Bereich in e...