Mysql kann keine nicht aggregierten Spalten auswählen

Mysql kann keine nicht aggregierten Spalten auswählen

1. Einleitung

Ich habe mein Blog kürzlich aktualisiert und unten auf der Artikelseite zwei Schaltflächen hinzugefügt, mit denen direkt zum vorherigen und nächsten Artikel gesprungen werden kann.

Wie in der folgenden Abbildung dargestellt:

Die Schwierigkeit bei der Implementierung dieser Funktion liegt darin: Wie wählt die Datenbank die beiden benachbarten Datensätze vor und nach einem Datensatz aus?

2. Datenbankdesign

Der Aufbau meiner Artikeldatenbank ist unten dargestellt:

Wie Sie sehen, ist die Identität jedes Datensatzes die Index-ID. Da viele Artikeldatensätze zuvor gelöscht wurden, sind die IDs nicht fortlaufend.

Wenn der Indexwert des aktuellen Artikels 33 ist, können Sie den folgenden Befehl verwenden, um die beiden benachbarten Artikel abzurufen:

Wählen Sie * aus der Passage, in der die ID enthalten ist
(wählen
Fall
wenn SIGN(id - 32)>0, DANN MIN(id)
wenn SIGN(id - 32)<0, DANN MAX(id)
Ende
aus der Passage
wobei id != 34
GROUP BY SIGN(id - 32 )
ORDER BY SIGN(id - 32)
)
BESTELLEN NACH ID;

3. Aggregatspalten können nicht ausgewählt werden

Beim Ausführen des obigen Befehls gab Mysql einen Fehler aus: SELECT list is not in GROUP BY clause ... Von Google habe ich erfahren, dass in MySQL 5.7 und höher „ only_full_group_by standardmäßig aktiviert ist und MySQL Abfragen ablehnt, auf die durch Auswahllisten, Bedingungen oder Sequenzlisten verwiesen wird.

Nachfolgend der Originaltext:

Lehnen Sie Abfragen ab, deren Auswahlliste, HAVING-Bedingung oder ORDER BY-Liste auf nicht aggregierte Spalten verweisen, die weder in der GROUP BY-Klausel benannt sind noch funktional von GROUP BY-Spalten abhängig sind (eindeutig bestimmt durch diese). Ab MySQL 5.7.5 umfasst der Standard-SQL-Modus ONLY_FULL_GROUP_BY. (Vor 5.7.5 erkennt MySQL keine funktionale Abhängigkeit und ONLY_FULL_GROUP_BY ist standardmäßig nicht aktiviert. Eine Beschreibung des Verhaltens vor 5.7.5 finden Sie im MySQL 5.6-Referenzhandbuch.)

Daher sollten wir sql_mode so einstellen, dass only_full_group_by nicht enthalten ist. Nach MySQL 5.7.5 wird only_full_group_by eine der Standardoptionen von sql_mode, was dazu führen kann, dass einige SQL-Anweisungen fehlschlagen.

Öffnen Sie die MySQL-Konfigurationsdatei, fügen Sie im Abschnitt [mysqld] die folgende Konfiguration hinzu und starten Sie MySQL neu.

[mysqld]
# ... andere Konfiguration
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # lösche 'only_full_group_by'
# ... andere Konfiguration

Führen Sie den MySQL-Befehl im zweiten Teil dieses Artikels aus. Das Ergebnis ist wie folgt:

4. Weiterführende Links

nur_vollständig_gruppieren_nach

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. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Nutzungs- und Leistungsoptimierungstechniken für die Aggregatfunktion „count“ in MySQL
  • Detaillierte Erläuterung der häufig verwendeten MySQL-Aggregatfunktionen
  • So fügen Sie bedingte Ausdrücke zu Aggregatfunktionen in MySql hinzu
  • php+mysql Open Source XNA-Aggregationsprogramm zum Download freigegeben
  • Detaillierte Erläuterung von Beispielen für MySQL-Einzeltabellenabfragevorgänge [Syntax, Einschränkungen, Gruppierung, Aggregation, Filterung, Sortierung usw.]
  • Analyse der Verwendung von MySQL-Abfragesortierung und Abfrageaggregationsfunktionen
  • MySQL verwendet Aggregatfunktionen zum Abfragen einer einzelnen Tabelle
  • MySQL-Gruppierungsabfragen und Aggregatfunktionen
  • Analyse des Prinzips und der Verwendung der kontinuierlichen MySQL-Aggregation
  • Optimieren der langsamen Abfrage von MySQL-Aggregatstatistikdaten

<<:  Detaillierte Erklärung der Lösung für das Problem, dass die Nohup-Protokollausgabe unter Linux zu groß ist

>>:  React-Diagramm Serialisierung JSON Interpretation Fallanalyse

Artikel empfehlen

So übertragen Sie Dateien zwischen Docker-Container und lokalem Computer

Zum Übertragen von Dateien zwischen dem Host und ...

Tutorial zur MySQL-Optimierung: Große Paging-Abfrage

Inhaltsverzeichnis Hintergrund LIMIT-Optimierung ...

Verwandte Befehle zur vollständigen Deinstallation von Nginx unter Ubuntu 16.04

nginx Übersicht nginx ist ein kostenloser, quello...

Detaillierte Erklärung der Vue-Anmeldung und -Abmeldung

Inhaltsverzeichnis Login-Geschäftsprozess Impleme...

So löschen Sie schnell alle Tabellen in MySQL, ohne die Datenbank zu löschen

Dieser Artikel beschreibt anhand eines Beispiels,...

So verwenden Sie vue.js zum Implementieren der Drag & Drop-Funktion

Vorwort Durch das Hinzufügen einer Drag & Dro...

Verwenden von js zum Implementieren eines Zahlenratespiels

Letzte Woche gab mir der Lehrer eine kleine Hausa...

Diagramm der Installationszusammenfassung für MySQL 8.0.11

Installationsumgebung: CAT /etc/os-release Zeigt ...

So erstellen Sie einen pptpd-Dienst in Alibaba Cloud Ubuntu 16.04

1. Um ein PPTP-VPN aufzubauen, müssen Sie Port 17...

Beispielanalyse des Prinzips der MySQL-Transaktionsisolationsebene

Einführung Dies ist Ihnen sicherlich schon einmal...

100-1% des Inhalts der Website ist Navigation

Website, (100-1)% des Inhalts ist Navigation 1. J...