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

Der einfachste Weg, ein Programm beim Start in Linux automatisch auszuführen

Ich habe viele davon gesammelt, aber alle endeten...

20 Wegweiser auf dem Weg zum exzellenten UI (User Interface)-Designer

Einleitung: Der Interface-Designer Joshua Porter h...

Linux-Datenträgerverwaltung – LVM-Nutzung

1. Einführung in LVM Bei der Verwaltung von Linux...

Javascript zum Umschalten durch Klicken auf das Bild

Durch Klicken Bilder zu wechseln, ist im Leben ei...

Zusammenfassung relevanter Erkenntnisse zur Umsetzung adaptiven Webdesigns

Wie funktioniert „Adaptives Webdesign“? Eigentlich...

Lösung zum Vergessen des MySQL-Datenbankkennworts unter MAC

Schnelle Lösung zum Vergessen des MySQL-Datenbank...

Vue erzielt einen nahtlosen Karusselleffekt

In diesem Artikel wird der spezifische Code von V...

Erstellen, Einschränkungen und Löschen von Fremdschlüsseln in MySQL

Vorwort Ab MySQL-Version 3.23.44 unterstützen Inn...

Grundlegender JSON-Betriebsleitfaden in MySQL 5.7

Vorwort Aufgrund der Projektanforderungen werden ...

CSS Sticky Footer-Implementierungscode

Dieser Artikel stellt den Implementierungscode fü...

Richtige Verwendung der Vue-Funktion Anti-Shake und Throttling

Vorwort 1. Entprellen: Nach dem Auslösen eines Ho...