Menghadapi ralat MySQL ONLY_FULL_GROUP_BY
? Panduan ini memberikan penjelasan yang jelas dan penyelesaian praktikal untuk pengguna MySQL yang baru dan berpengalaman.
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY
ialah tetapan MySQL yang menguatkuasakan gelagat GROUP BY
standard. Dengan tetapan ini didayakan, pernyataan SELECT
anda mesti mematuhi peraturan ini:
SELECT
mestilah dalam GROUP BY
: Setiap lajur yang dipilih juga mesti disertakan dalam klausa GROUP BY
.GROUP BY
memerlukan fungsi agregat (cth., COUNT
, SUM
, AVG
, MAX
, MIN
).GROUP BY
.Pertimbangkan jadual bernama 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>
Pertanyaan ini akan mencetuskan ralat:
<code class="language-sql">SELECT customer_name, product, SUM(amount) FROM orders GROUP BY customer_name;</code>
Masalahnya? product
dipilih tetapi tidak dikumpulkan. MySQL tidak dapat menentukan produk yang hendak dipaparkan untuk setiap pelanggan (kerana mereka mungkin telah membeli berbilang item).
Penyelesaian 1: Ubah suai Tetapan MySQL
Pembetulan pantas (peringkat sesi):
<code class="language-sql">SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));</code>
Pembetulan kekal (peringkat global):
<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>
Penyelesaian 2: Laraskan Pertanyaan Anda
GROUP BY
:<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>
ID Unik Tiada: Salah: SELECT id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
Betul: SELECT MIN(id) as first_order_id, customer_name, COUNT(*) FROM orders GROUP BY customer_name;
Gabungan Kompleks: Berhati-hati pertimbangkan pengagregatan apabila menggunakan gabungan dengan GROUP BY
. Gunakan fungsi agregat dengan sewajarnya atau faktorkan semula pertanyaan anda menggunakan subkueri.
ONLY_FULL_GROUP_BY
untuk ketepatan pertanyaan yang dipertingkatkan dan pematuhan kepada piawaian SQL.SELECT @@sql_mode;
SHOW VARIABLES LIKE 'sql_mode';
SHOW GRANTS;
ONLY_FULL_GROUP_BY
DidayakanWalaupun melumpuhkannya adalah menarik, pertimbangkan untuk mengekalkan ONLY_FULL_GROUP_BY
aktif untuk projek baharu, pematuhan kepada piawaian SQL dan untuk mengelakkan ralat pertanyaan yang halus.
Ralat ONLY_FULL_GROUP_BY
, walaupun pada mulanya mengecewakan, menggalakkan reka bentuk pertanyaan yang lebih baik. Memahami tujuannya dan melaksanakan penyelesaian yang betul akan meningkatkan kemahiran MySQL dan kebolehselenggaraan kod anda. Utamakan pemilihan data yang tepat dan fungsi agregat yang sesuai. Selamat mengekod!
Atas ialah kandungan terperinci MySQL ONLY_FULL_GROUP_BY Ralat: Pembetulan Mudah dan Amalan Terbaik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!