Heim >Datenbank >MySQL-Tutorial >MySQL ONLY_FULL_GROUP_BY-Fehler: Einfache Korrekturen und Best Practices
Stößt du auf den MySQL-ONLY_FULL_GROUP_BY
-Fehler? Dieser Leitfaden bietet klare Erklärungen und praktische Lösungen sowohl für Anfänger als auch für erfahrene MySQL-Benutzer.
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY
ist eine MySQL-Einstellung, die das Standardverhalten GROUP BY
erzwingt. Wenn diese Einstellung aktiviert ist, müssen Ihre SELECT
-Anweisungen diesen Regeln entsprechen:
SELECT
müssen in GROUP BY
sein: Jede ausgewählte Spalte muss auch in der GROUP BY
-Klausel enthalten sein.GROUP BY
enthalten sind, erfordern Aggregatfunktionen (z. B. COUNT
, SUM
, AVG
, MAX
, MIN
).GROUP BY
-Klausel abhängig sein.Stellen Sie sich eine Tabelle mit dem Namen orders
:
<code class="language-sql">CREATE TABLE orders ( id INT, customer_name VARCHAR(100), product VARCHAR(100), amount DECIMAL(10,2) ); INSERT INTO orders VALUES (1, 'John', 'Laptop', 1000), (2, 'John', 'Mouse', 20), (3, 'Mary', 'Keyboard', 50), (4, 'Mary', 'Monitor', 200);</code>
Diese Abfrage löst den Fehler aus:
<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name;</code>
Das Problem? product
ist ausgewählt, aber nicht gruppiert. MySQL kann nicht bestimmen, welches Produkt für jeden Kunden angezeigt werden soll (da dieser möglicherweise mehrere Artikel gekauft hat).
Lösung 1: MySQL-Einstellungen ändern
Eine schnelle Lösung (Sitzungsebene):
<code class="language-sql">SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));</code>
Eine dauerhafte Lösung (globale Ebene):
<code class="language-sql">SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';</code>
Lösung 2: Passen Sie Ihre Abfragen an
GROUP BY
einschließen:<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name, product;</code>
MAX
, MIN
):<code class="language-sql">SELECT customer_name, MAX(product) as product, SUM(amount) as total_amount FROM orders GROUP BY customer_name;</code>
<code class="language-sql">SELECT o.* FROM orders o INNER JOIN ( SELECT customer_name, SUM(amount) as total_amount FROM orders GROUP BY customer_name ) grouped ON o.customer_name = grouped.customer_name;</code>
<code class="language-sql">SELECT category, MAX(product_name) as top_product, COUNT(*) as total_orders, SUM(amount) as total_sales FROM sales GROUP BY category;</code>
<code class="language-sql">SELECT customer_id, MIN(first_name) as first_name, MIN(last_name) as last_name, COUNT(*) as total_purchases, SUM(purchase_amount) as total_spent, AVG(purchase_amount) as avg_purchase_amount FROM customer_purchases GROUP BY customer_id;</code>
Fehlende eindeutige IDs: Falsch: SELECT id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
Richtig: SELECT MIN(id) as first_order_id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
Komplexe Joins: Berücksichtigen Sie sorgfältig die Aggregation, wenn Sie Joins mit GROUP BY
verwenden. Verwenden Sie Aggregatfunktionen entsprechend oder überarbeiten Sie Ihre Abfrage mithilfe von Unterabfragen.
ONLY_FULL_GROUP_BY
, um die Abfragegenauigkeit und die Einhaltung von SQL-Standards zu verbessern.SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';
SHOW GRANTS;
ONLY_FULL_GROUP_BY
aktiviert bleiben sollteAuch wenn es verlockend ist, es zu deaktivieren, sollten Sie darüber nachdenken, ONLY_FULL_GROUP_BY
für neue Projekte aktiv zu lassen, die SQL-Standards einzuhalten und subtile Abfragefehler zu verhindern.
Der ONLY_FULL_GROUP_BY
-Fehler ist zwar zunächst frustrierend, regt aber zu einem besseren Abfragedesign an. Wenn Sie den Zweck verstehen und die richtigen Lösungen implementieren, verbessern Sie Ihre MySQL-Kenntnisse und die Wartbarkeit des Codes. Priorisieren Sie eine genaue Datenauswahl und geeignete Aggregatfunktionen. Viel Spaß beim Codieren!
Das obige ist der detaillierte Inhalt vonMySQL ONLY_FULL_GROUP_BY-Fehler: Einfache Korrekturen und Best Practices. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!