mysql - 如何将这 3 个不同的查询合并为一个?
问题描述
我在 MySQL 数据库中有 3 个查询,它们输出除了最后一个之外的所有相同字段,这是一个计算。如果可能的话,我想将它们组合成一个查询,输出公共字段和额外的计算字段。
这些是查询:
查询一:
SELECT
accesslogs.login,
usuarios.login,
usuarios.nombre,
usuarios.apellido,
COUNT(*)
FROM
accesslogs
LEFT JOIN usuarios ON accesslogs.login = usuarios.id_usuario
WHERE
accesslogs.id_campania=173
AND accesslogs.tipo_acceso='A'
AND usuarios.id_usuario != 6658
GROUP BY accesslogs.login
ORDER BY usuarios.login ASC
查询 2:
SELECT
accesslogs.login,
usuarios.login,
usuarios.nombre,
usuarios.apellido,
MIN(accesslogs.fecha_registro)
FROM
accesslogs
LEFT JOIN usuarios ON accesslogs.login = usuarios.id_usuario
WHERE
accesslogs.id_campania=173
AND accesslogs.tipo_acceso='A'
AND usuarios.id_usuario != 6658
GROUP BY accesslogs.login
ORDER BY usuarios.login ASC
查询 3:
SELECT
accesslogs.login,
usuarios.login,
usuarios.nombre,
usuarios.apellido,
COUNT(*)
FROM
accesslogs
LEFT JOIN usuarios ON accesslogs.login = usuarios.id_usuario
WHERE
accesslogs.id_campania=173
AND accesslogs.tipo_acceso='U'
AND usuarios.id_usuario != 6658
GROUP BY accesslogs.login
ORDER BY usuarios.login ASC
您会注意到 中的前 4 个字段SELECT
始终相同。我正在寻找的输出是这样的:
Field 1 | Field 2 | Field 3 | Field 4 | CF Query 1 | CF Query 2 | CF Query 3
CF:计算字段,对应查询的SELECT中的最后一个字段
解决方案
以下查询应该可以完成工作。我将WHERE
条件更改tipo_acceso
为IN
子句并使用条件聚合来计算计数和最小值。
SELECT
a.login,
u.login,
u.nombre,
u.apellido,
SUM(a.tipo_acceso = 'A') cnt_A,
MIN(CASE WHEN a.tipo_acceso = 'A' THEN a.fecha_registro END) min_fecha_registro,
SUM(a.tipo_acceso = 'U') cnt_U
FROM
accesslogs a
LEFT JOIN usuarios u ON a.login = u.id_usuario
WHERE
a.id_campania = 173
AND a.tipo_acceso IN ('A', 'U')
AND u.id_usuario != 6658
GROUP BY
a.login,
u.login,
u.nombre,
u.apellido
ORDER BY
u.login ASC
其他值得注意的点:
所有非聚合列必须出现在
GROUP BY
子句中;在除旧版本 MySQL 之外的任何 RDBMS 上,不遵守此规则会产生致命错误我使用表别名来缩短查询
推荐阅读
- vb.net - 如何在datagridview vb.net中根据最大最小数据值进行加权
- json - 如何在我的公司网站上呈现公司 Linkedin 的工作?
- html - 如何使最后一个元素脱离flex?
- r - 如何在 dplyr 中使用多列实现函数
- c - GCC 编译器在 CodeBlocks IDE 中无法识别(设置变量:LD_LIBRARY_PATH=.:)
- r - R、rnaturalearth 和 sf:从地图中删除单个边框
- javascript - 无法使用 aws-iot-device-sdk 发布,但可以订阅
- django - 将脚本标签添加到所有 django 模板
- c++ - 如何编译带有错误“没有匹配函数调用'to_string'”的程序?C++
- python - 如何根据公式从单行创建多行?