如何将这3个不同的查询合并为一个?

时间:2019-09-02 17:13:17

标签: mysql sql

我在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中的最后一个字段

2 个答案:

答案 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