如何将 WHERE 子句应用于 MySQL 子查询和聚合函数中的特定字段?

DDD
发布: 2024-11-05 15:38:02
原创
367 人浏览过

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!