Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menyelesaikan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?

Bagaimana untuk Menyelesaikan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?

Patricia Arquette
Lepaskan: 2025-01-10 14:59:44
asal
179 orang telah melayarinya

How to Resolve Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

SQL GROUP BY dan ORDER BY Konflik Penamaan Klausa: Penyelesaian

Pertanyaan asal menghadapi masalah apabila mengumpulkan data mengikut model perkakasan, jenis hasil dan kes disebabkan oleh konflik penamaan antara lajur ungkapan CASE yang dikira dan lajur sumber (attempt.result). Ini membawa kepada berbilang baris untuk jenis dan kombinasi huruf besar yang sama.

Penyelesaian terletak pada mengelakkan penggunaan langsung nama lajur sumber dalam klausa GROUP BY. Berikut ialah dua pendekatan yang berkesan:

Kaedah 1: Himpunkan mengikut ungkapan CASE secara langsung:

Daripada mengumpulkan mengikut attempt.result, kumpulkan mengikut ungkapan CASE itu sendiri:

<code class="language-sql">GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
Salin selepas log masuk

Ini secara langsung mengumpulkan data berdasarkan hasil pengiraan pernyataan CASE, menghapuskan kekaburan.

Kaedah 2: Gunakan alias lajur:

Tetapkan alias pada CASE lajur output ungkapan:

<code class="language-sql">SELECT ..., CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1
GROUP BY model.name, attempt.type, result1</code>
Salin selepas log masuk

Alyas result1 dengan jelas membezakan lajur yang dikira daripada lajur sumber, menyelesaikan konflik. Ambil perhatian bahawa ORDER BY akan mengutamakan nama lajur beralias (result1) dalam kes ini.

Amalan Terbaik: Rujukan Kedudukan

Untuk mengelakkan konflik penamaan sepenuhnya, gunakan rujukan kedudukan dalam klausa GROUP BY dan ORDER BY. Pendekatan ini kurang terdedah kepada ralat dan meningkatkan kebolehbacaan pertanyaan, terutamanya dalam pertanyaan kompleks. Contoh di bawah menunjukkan teknik ini dalam pertanyaan yang dipermudahkan dan ditulis semula:

<code class="language-sql">SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct
FROM attempt a
JOIN prod_hw_id p USING (hard_id)
JOIN model m USING (model_id)
WHERE ts >= '2013-11-06 00:00:00' AND ts < CURRENT_DATE  --Corrected the incomplete WHERE clause
GROUP BY 1, 2, 3  -- Positional references for model.name, a.type, result
ORDER BY 1, 2, 3  -- Positional references for model.name, a.type, result</code>
Salin selepas log masuk

Pertanyaan yang disemak ini lebih ringkas dan mengelakkan kemungkinan pertembungan penamaan. Ingat untuk sentiasa menyemak klausa WHERE anda untuk kesempurnaan. Yang asal tidak lengkap dan dibetulkan di atas.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Konflik Penamaan dalam SQL GROUP BY dan ORDER BY Klausa?. 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