MySQL - Query和Subquery之间的交互,有可能吗?

时间:2016-01-13 10:18:01

标签: mysql

让我们假设这个复杂的查询;

SELECT cl.id, cl.nombre, 
    (SELECT count(*) FROM (SELECT count(ac.id)
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3 AND id_cliente = 3
    GROUP BY ac.id
    HAVING count(*) > 1) tabla_ac_grupales) as ac_grupales,
    (SELECT count(*) FROM (SELECT count(ac.id)
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3 AND id_cliente = 3
    GROUP BY ac.id
    HAVING count(*) = 1) tabla_ac_individuales ) as ac_individuales
FROM inter_clientes_acciones ia
JOIN clientes cl ON ia.id_cliente = cl.id
JOIN acciones ac ON ia.id_accion = ac.id
WHERE cl.id = 3 AND asistencia = 1 AND (ia.id_accion IN (
    SELECT ac.id as id_accion
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3
    GROUP BY ac.id
    HAVING count(*) > 1
 ) OR ia.id_accion IN (
    SELECT ac.id as id_accion
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3
    GROUP BY ac.id
    HAVING count(*) = 1  
 )
)
GROUP BY cl.id

正如您所看到的,我们有2个子查询,它们计算另一个子查询的行数,并返回与where子句匹配的所有客户端(我们在其中有另一个子查询)以及此客户端参与的操作数。事实是我在查询的where子句和子查询中标记了cl.id = 3。我的问题是,如何在不指定客户端ID的情况下进行查询和子查询?我想要的是用他的号码获得所有客户。

这可以通过查询完成,还是我必须执行存储过程?此外,如果您知道更好的方法,请随意说出来。

架构操作:

id
(another non important fields)

架构客户端:

id
(another non important fields)

架构inter_clients_actions:

id
id_client
id_action
attend (Boolean)

1 个答案:

答案 0 :(得分:1)

不能这个

WHERE cl.id = 3 AND asistencia = 1 AND (ia.id_accion IN (
    SELECT ac.id as id_accion
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3
    GROUP BY ac.id
    HAVING count(*) > 1
 ) OR ia.id_accion IN (
    SELECT ac.id as id_accion
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3
    GROUP BY ac.id
    HAVING count(*) = 1  
 )
)

简单地说:

WHERE cl.id = 3 AND asistencia = 1 AND (ia.id_accion IN (
    SELECT ac.id as id_accion
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3
    GROUP BY ac.id
    HAVING count(*) >= 1
 )
)

而且非常简单:

AND id_cliente = 3

AND id_cliente = cl.id

最终查询:

SELECT cl.id, cl.nombre, 
    (SELECT count(*) FROM (SELECT count(ac.id)
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = 3 AND id_cliente = cl.id
    GROUP BY ac.id
    HAVING count(*) >= 1) tabla_ac_grupales) as res_all
FROM inter_clientes_acciones ia
JOIN clientes cl ON ia.id_cliente = cl.id
JOIN acciones ac ON ia.id_accion = ac.id
WHERE asistencia = 1 AND (ia.id_accion IN (
    SELECT ac.id as id_accion
    FROM acciones ac
    LEFT JOIN inter_clientes_acciones ia ON ac.id = ia.id_accion
    LEFT JOIN clientes cl ON ia.id_cliente = cl.id
    WHERE fecha_fin < CURDATE() AND ac.id_proyecto = cl.id
    GROUP BY ac.id
    HAVING count(*) >= 1
 )
)
GROUP BY cl.id

res_all > 1然后分组,当`res_all = 1'然后是个人。