Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Memohon Klausa WHERE ke Medan Khusus dalam Subkueri MySQL dan Fungsi Agregat?

Bagaimana untuk Memohon Klausa WHERE ke Medan Khusus dalam Subkueri MySQL dan Fungsi Agregat?

DDD
DDDasal
2024-11-05 15:38:02369semak imbas

How to Apply a WHERE Clause to a Specific Field in MySQL Subqueries and Aggregate Functions?

Adakah Terdapat Cara untuk Memaparkan Klausa WHERE untuk Medan Khusus dalam MySQL?

Dalam MySQL, secara amnya tidak mungkin untuk menentukan Klausa WHERE untuk medan tertentu dalam subkueri atau fungsi agregat. Walau bagaimanapun, terdapat penyelesaian dan teknik tertentu yang boleh membantu mencapai hasil yang serupa.

Penghadan Klausa WHERE dalam Subkueri dan Fungsi Agregat

Secara lalai, klausa WHERE tidak boleh digunakan kepada lajur bukan agregat dalam subkueri atau fungsi agregat. Ini kerana MySQL menganggap lajur ini sebagai tidak ditentukan untuk setiap kumpulan, yang membawa kepada hasil yang bercanggah. Contohnya:

<code class="sql">SELECT
  cursos.cursoID AS idcurso,
  cursos.estadoCurso,
  cursosUsuarios.userHabilitado AS 'ok',
  GROUP_CONCAT(cursosUsuarios.userID SEPARATOR ',') AS 'usuarios'
FROM cursos
LEFT JOIN cursosUsuarios
  ON cursos.cursoID = cursosUsuarios.cursoID
 LEFT JOIN usuarios
  ON cursosUsuarios.userID = usuarios.userID
WHERE
  cursos.estadoCurso = 'abierto'
GROUP BY
  cursos.cursoID;</code>

Pertanyaan di atas, yang mendapatkan semula kursus dan maklumat pendaftaran pengguna, tidak boleh memasukkan klausa WHERE untuk pengguna tertentu:

<code class="sql">WHERE usuarios.userID = 70</code>

Penyelesaian dan Pendekatan Alternatif

Untuk mencapai hasil yang diinginkan, pertimbangkan perkara berikut pendekatan:

  • Subquery dengan IN Operator: Gantikan klausa WHERE yang tidak diagregatkan dalam subquery dengan operator IN, memilih ID pengguna tertentu daripada jadual kedua.
  • CTE (Ungkapan Jadual Biasa): Gunakan CTE untuk pra-penapis data sebelum menggunakan fungsi agregat. Ini membenarkan kemasukan klausa WHERE untuk medan tertentu.
  • Pembinaan Klausa WHERE Dinamik: Gunakan penggabungan untuk membina klausa WHERE secara dinamik berdasarkan input pengguna atau parameter lain.

Contoh menggunakan CTE (Common Table Ungkapan):

Pertanyaan berikut menggunakan CTE untuk pra-menapis data pendaftaran pengguna sebelum menggunakan fungsi agregat:

<code class="sql">WITH FilteredEnrollments AS (
  SELECT
    userID,
    cursoID,
    userHabilitado
  FROM cursosUsuarios
  WHERE
    userID = 70
)
SELECT
  cursos.cursoID AS idcurso,
  cursos.estadoCurso,
  FilteredEnrollments.userHabilitado AS 'ok',
  GROUP_CONCAT(FilteredEnrollments.userID SEPARATOR ',') AS 'usuarios'
FROM cursos
LEFT JOIN FilteredEnrollments
  ON cursos.cursoID = FilteredEnrollments.cursoID
WHERE
  cursos.estadoCurso = 'abierto'
GROUP BY
  cursos.cursoID;</code>

Dalam contoh ini, jadual cursosUsuarios ditapis menggunakan CTE untuk hanya memasukkan rekod untuk pengguna yang ditentukan, yang membenarkan paparan yang betul bagi medan userHabilitado.

Atas ialah kandungan terperinci Bagaimana untuk Memohon Klausa WHERE ke Medan Khusus dalam Subkueri MySQL dan Fungsi Agregat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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