我在MySQL数据库中有3个查询,这些查询输出除最后一个字段(计算值)以外的所有相同字段。如果可能的话,我希望将它们组合成一个查询,该查询输出公共字段和其他计算出的字段。
这些是查询:
查询1:
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
您会注意到SELECT
中的前4个字段始终相同。我正在寻找的输出是这样的:
Field 1 | Field 2 | Field 3 | Field 4 | CF Query 1 | CF Query 2 | CF Query 3
CF:计算字段,对应查询的SELECT中的最后一个字段
答案 0 :(得分:1)
以下查询应完成工作。我将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上,不遵守此规则都会产生致命错误
我使用表别名来缩短查询
答案 1 :(得分:0)
您可以使用UNION
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
UNION
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
UNION
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