Detaillierte Erläuterung des Problems der gemischten Verwendung von Limit- und Summenfunktionen in MySQL

Detaillierte Erläuterung des Problems der gemischten Verwendung von Limit- und Summenfunktionen in MySQL

Vorwort

Heute entschied sich ein Kollege nach der Synchronisierung der Bestelldaten, die Funktionen LIMIT und SUM() zu verwenden, um den Gesamtbetrag der aktuellen Seite zu berechnen, um den Gesamtbetrag einer bestimmten Bestellung mit der anderen Partei zu vergleichen, da es einen Unterschied zwischen dem Gesamtbestellbetrag und dem Gesamtbetrag der Datenquelle gab. Er stellte jedoch fest, dass der berechnete Betrag nicht der Gesamtbetrag der seitenweise angezeigten Bestellungen, sondern der Gesamtbetrag aller Bestellungen war.

Die Datenbankversion ist MySQL 5.7. Nachfolgend erläutern wir das aufgetretene Problem anhand eines Beispiels.

Problemüberprüfung

In dieser Rezension wird als Beispiel eine sehr einfache Bestelltabelle verwendet.

Datenaufbereitung

Die Anweisung zum Erstellen der Auftragstabelle lautet wie folgt (ich bin hier faul und verwende die Auto-Increment-ID. Es wird nicht empfohlen, die Auto-Increment-ID in der tatsächlichen Entwicklung als Auftrags-ID zu verwenden).

CREATE TABLE `Reihenfolge` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Bestell-ID',
 `Betrag` Dezimalzahl (10,2) NICHT NULL KOMMENTAR 'Bestellbetrag',
 PRIMÄRSCHLÜSSEL (`id`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8mb4;

Das SQL zum Einfügen eines Betrags von 100 lautet wie folgt (10-mal ausführen):

INSERT INTO `Bestellung`(`Betrag`) WERTE (100);

Der Gesamtbetrag beträgt also 10*100=1000.

Problem SQL

Verwenden Sie limit, um die Daten in Seiten abzufragen, und verwenden Sie die Funktion sum(), um den Gesamtbetrag der aktuellen Seite zu berechnen

WÄHLEN 
  SUM(`Betrag`)
AUS
  `Bestellung`
BESTELLEN NACH `id`
GRENZE 5;

Wie oben erwähnt, ist das erwartete Ergebnis 5*100=500, das tatsächliche Ergebnis ist jedoch 1000,00 (der Dezimalpunkt ist auf den Datentyp zurückzuführen).

Fehlerbehebung

Wenn Sie über ein gewisses Verständnis der Ausführungsreihenfolge von SELECT-Anweisungen verfügen, können Sie schnell feststellen, warum das zurückgegebene Ergebnis die Gesamtsumme aller Bestellungen ist. Als nächstes werde ich das Problem basierend auf der Ausführungsreihenfolge des problematischen SQL analysieren:

  1. FROM: Zuerst wird die FROM-Klausel ausgeführt, die feststellt, dass es sich bei der Abfrage um die Auftragstabelle handelt.
  2. SELECT: Die SELECT-Klausel ist die zweite ausgeführte Klausel, und zu diesem Zeitpunkt wird auch die Funktion SUM() ausgeführt.
  3. ORDER BY: Die ORDER BY-Klausel ist die dritte ausgeführte Klausel und hat nur ein Ergebnis, nämlich den Gesamtbetrag der Bestellung.
  4. LIMIT: Die LIMIT-Klausel wird zuletzt ausgeführt. Zu diesem Zeitpunkt gibt es nur ein Ergebnis im Ergebnissatz (den Gesamtbetrag der Bestellung).

Ergänzender Inhalt

Hier ist die Ausführungsreihenfolge der SELECT-Anweisung

  1. VON <linke_Tabelle>
  2. ON <Beitrittsbedingung>
  3. <join_type> JOIN <rechte_Tabelle>
  4. WHERE <Wo_Bedingung>
  5. GROUP BY <Gruppenliste>
  6. HAVING <Haben_Bedingung>
  7. WÄHLEN
  8. DISTINCT <Auswahlliste>
  9. ORDER BY <Bestellbedingung>
  10. LIMIT <Grenzwert_Nummer>

Lösung

Wenn Sie Paging-Daten zählen müssen (außer der Funktion SUM() haben auch die allgemeinen Funktionen COUNT(), AVG(), MAX() und MIN() dieses Problem), können Sie zur Handhabung eine Unterabfrage verwenden (PS: Die Speicherberechnung wird hier nicht berücksichtigt, der Zweck besteht darin, die Datenbank zur Lösung dieses Problems zu verwenden). Die Lösung des obigen Problems lautet wie folgt:

WÄHLEN 
  SUMME(o.Betrag)
AUS
  (WÄHLEN 
    `Betrag`
  AUS
    `Bestellung`
  BESTELLEN NACH `id`
  GRENZE 5) AS o;

Der Rückgabewert der Operation beträgt 500,00.

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:
  • MySQL-Abfrageoptimierung: LIMIT 1 vermeidet vollständigen Tabellenscan und verbessert die Abfrageeffizienz
  • Warum wird die MySQL-Paging-Funktion bei Verwendung von Limits immer langsamer?
  • Beschreibung des MySQL-Optimierungsparameters query_cache_limit
  • Detaillierte Erläuterung der Fallstricke beim Mischen von MySQL-Order-By und Limit
  • Einfaches Beispiel für den Grenzwertparameter der MySQL-Paging
  • Gründe und Optimierungslösungen für langsames MySQL-Limit-Paging mit großen Offsets
  • Mysql-Sortierung und Paginierung (Order by & Limit) und vorhandene Fallstricke
  • So verwenden Sie das MySQL-Limit und lösen das Problem großer Paging-Aufgaben
  • So verbessern Sie die MySQL Limit-Abfrageleistung
  • Detaillierte Erläuterung der MySQL Limit-Leistungsoptimierung und der Paging-Daten-Leistungsoptimierung
  • Eine kurze Diskussion über die Implementierung der MySQL-Lösung zur Optimierung des Seitenlimits
  • Die Auswirkungen des Limits auf die Abfrageleistung in MySQL

<<:  So berechnen Sie mit Linux den von zeitgesteuerten Dateien belegten Speicherplatz

>>:  Eine einfache Möglichkeit, die Drag-Screenshot-Funktion von Vue zu implementieren

Artikel empfehlen

Implementierung eines einfachen Karussells auf Basis von JavaScript

In diesem Artikel wird der spezifische JavaScript...

Lösung für das Problem, dass sich der mysql8.0.11-Client nicht anmelden kann

In diesem Artikel erfahren Sie, wie Sie das Probl...

Vue implementiert den Lupeneffekt beim Tab-Umschalten

In diesem Artikelbeispiel wird der spezifische Co...

5 Möglichkeiten zum Senden von E-Mails in der Linux-Befehlszeile (empfohlen)

Wenn Sie eine E-Mail in einem Shell-Skript erstel...

Erfahrungsaustausch zur MySQL-Slave-Wartung

Vorwort: Die MySQL-Master-Slave-Architektur dürft...

Skin-Change-Lösung basierend auf Vue kombiniert mit ElementUI

Inhaltsverzeichnis Vorne geschrieben Lösung 1: Gl...

Beispielcode für das MySQL-Indexprinzip ganz links

Vorwort Ich habe kürzlich etwas über MySQL-Indize...

So fügen Sie einem Feld in MySQL eine Standardzeit hinzu

Unterschiede und Verwendungen von Datumstypen MyS...

Warum DOCTYPE HTML verwenden?

Sie wissen, dass der Browser ohne diese Option bei...

Native js implementiert Warenkorb-Logik und -Funktionen

In diesem Artikelbeispiel wird der spezifische Co...

So fügen Sie Videos in HTML ein und machen sie mit allen Browsern kompatibel

Zum Einfügen von Videos in HTML werden am häufigst...

js implementiert ein einfaches Warenkorbmodul

In diesem Artikelbeispiel wird der spezifische Co...