首頁 > 資料庫 > mysql教程 > 如何將 WHERE 子句應用於 MySQL 子查詢和聚合函數中的特定欄位?

如何將 WHERE 子句應用於 MySQL 子查詢和聚合函數中的特定欄位?

DDD
發布: 2024-11-05 15:38:02
原創
446 人瀏覽過

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

有沒有辦法在MySQL中顯示特定欄位的WHERE子句?

在MySQL中,通常無法指定一個用於子查詢或聚合函數中特定欄位的 WHERE 子句。但是,有一些解決方法和技術可以幫助實現類似的結果。

子查詢和聚合函數中 WHERE 子句的限制

預設情況下,無法套用 WHERE 子句子查詢或聚合函數中的非聚合列。這是因為 MySQL 將每個群組的這些欄位視為未定義,從而導致結果衝突。例如:

<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>
登入後複製

上面的查詢檢索課程和用戶註冊信息,不能包含特定用戶的WHERE 子句:

<code class="sql">WHERE usuarios.userID = 70</code>
登入後複製

解決方法和替代方法

要獲得所需的結果,請考慮以下方法:

  • 使用IN 運算子的子查詢: 替換子查詢中的非聚合WHERE 子句使用IN 運算符,從輔助表中選擇特定的使用者ID。
  • CTE(公用表表達式): 在應用聚合函數之前使用 CTE 預過濾資料。這允許包含特定欄位的 WHERE 子句。
  • 動態 WHERE 子句建構:使用串聯根據使用者輸入或其他參數動態建立 WHERE 子句。

使用CTE(通用表表達式)的範例:

以下查詢在應用聚合函數之前使用CTE 預過濾使用者註冊資料:

<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>
登入後複製

在此範例中,cursosUsuarios 表使用CTE 進行過濾,僅包含指定使用者的記錄,因此可以正確顯示userHabilitado 欄位。

以上是如何將 WHERE 子句應用於 MySQL 子查詢和聚合函數中的特定欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板