让我们假设这个复杂的查询;
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)
答案 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'然后是个人。