Rumah > pangkalan data > tutorial mysql > MySQL ONLY_FULL_GROUP_BY Ralat: Pembetulan Mudah dan Amalan Terbaik

MySQL ONLY_FULL_GROUP_BY Ralat: Pembetulan Mudah dan Amalan Terbaik

Linda Hamilton
Lepaskan: 2025-01-14 20:02:44
asal
257 orang telah melayarinya

MySQL ONLY_FULL_GROUP_BY Error: Easy Fixes and Best Practices

Menghadapi ralat MySQL ONLY_FULL_GROUP_BY? Panduan ini memberikan penjelasan yang jelas dan penyelesaian praktikal untuk pengguna MySQL yang baru dan berpengalaman.

Pemahaman 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:

  • Semua lajur dalam SELECT mestilah dalam GROUP BY: Setiap lajur yang dipilih juga mesti disertakan dalam klausa GROUP BY.
  • Fungsi agregat untuk lajur lain: Lajur tiada dalam GROUP BY memerlukan fungsi agregat (cth., COUNT, SUM, AVG, MAX, MIN).
  • Kebergantungan fungsi: Lajur yang dipilih mestilah bergantung secara fungsi pada lajur dalam klausa GROUP BY.

Mengapa Ralat Berlaku

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>
Salin selepas log masuk

Pertanyaan ini akan mencetuskan ralat:

<code class="language-sql">SELECT customer_name, product, SUM(amount)
FROM orders
GROUP BY customer_name;</code>
Salin selepas log masuk

Masalahnya? product dipilih tetapi tidak dikumpulkan. MySQL tidak dapat menentukan produk yang hendak dipaparkan untuk setiap pelanggan (kerana mereka mungkin telah membeli berbilang item).

Menyelesaikan Ralat

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Penyelesaian 2: Laraskan Pertanyaan Anda

  • Kaedah A: Sertakan semua lajur dalam GROUP BY:
<code class="language-sql">SELECT customer_name, product, SUM(amount)
FROM orders
GROUP BY customer_name, product;</code>
Salin selepas log masuk
  • Kaedah B: Gunakan fungsi agregat (cth., 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>
Salin selepas log masuk
  • Kaedah C: Gunakan subkueri:
<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>
Salin selepas log masuk

Aplikasi Dunia Sebenar

  • Contoh 1: Laporan Jualan
<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>
Salin selepas log masuk
  • Contoh 2: Analisis Pelanggan
<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>
Salin selepas log masuk

Mengelakkan Perangkap Biasa

  1. 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;

  2. Gabungan Kompleks: Berhati-hati pertimbangkan pengagregatan apabila menggunakan gabungan dengan GROUP BY. Gunakan fungsi agregat dengan sewajarnya atau faktorkan semula pertanyaan anda menggunakan subkueri.

Amalan Terbaik

  1. Tentukan dengan jelas keperluan data anda.
  2. Gunakan fungsi agregat yang sesuai.
  3. Kumpulkan mengikut semua lajur yang berkaitan.
  4. Pertimbangkan untuk mengekalkan ONLY_FULL_GROUP_BY untuk ketepatan pertanyaan yang dipertingkatkan dan pematuhan kepada piawaian SQL.

Menyelesaikan masalah

  1. Semak tetapan MySQL semasa: SELECT @@sql_mode;
  2. Sahkan perubahan: SHOW VARIABLES LIKE 'sql_mode';
  3. Semak kebenaran: SHOW GRANTS;

Bila Perlu Kekalkan ONLY_FULL_GROUP_BY Didayakan

Walaupun 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.

Kesimpulan

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan