/ / agrupando por no trabajar con múltiples cuentas - mysql, sql

agrupando por no trabajar con múltiples cuentas - mysql, sql

Tengo el siguiente SQL:

SELECT team_instance.id,COUNT(dropkicks.id) * 3
FROM team_instance
INNER JOIN player_instance ON team_instance.id = player_instance.team_instance_id
INNER JOIN dropkicks ON player_instance.id = dropkicks.kicker_id
WHERE dropkicks.success = true
GROUP BY team_instance.id

que funciona como se esperaba - devuelve el valor de conteo agrupado por el id de instancia de equipo.

Lo que tengo que hacer es combinar varios conteos para que la instancia de equipo muestre el total de dos tablas (penalizaciones y dropkicks):

SELECT id AS team_instance_id,
(
SELECT COUNT(dropkicks.id) * 3
FROM team_instance
INNER JOIN player_instance ON team_instance.id = player_instance.team_instance_id
INNER JOIN dropkicks ON player_instance.id = dropkicks.kicker_id
WHERE dropkicks.success = true


) +

(
SELECT COUNT(penalty_kicks.id) * 3
FROM team_instance
INNER JOIN player_instance ON team_instance.id = player_instance.team_instance_id
INNER JOIN penalty_kicks ON player_instance.id = penalty_kicks.kicker_id
WHERE penalty_kicks.success = true
)
AS total
FROM team_instance
GROUP BY team_instance.id

pero esto no funciona correctamente ya que los valores para ambas instancias de equipo son los mismos (y no deberían ser).

Respuestas

2 para la respuesta № 1

Debe correlacionar las subconsultas con la consulta externa. Además, no necesitas un group by asumiendo que id Es, bueno, una identificación. El unirse a team_instance También es superfluo en las subconsultas, así que creo que esto es más de lo que quieres:

SELECT id AS team_instance_id,
(SELECT COUNT(dropkicks.id) * 3
FROM player_instance INNER JOIN
dropkicks
ON player_instance.id = dropkicks.kicker_id
WHERE team_instance.id = player_instance.team_instance_id AND dropkicks.success = true
) +
(SELECT COUNT(penalty_kicks.id) * 3
FROM player_instance INNER JOIN
penalty_kicks
ON player_instance.id = penalty_kicks.kicker_id
WHERE team_instance.id = player_instance.team_instance_id AND penalty_kicks.success = true
) AS total
FROM team_instance;

La razón por la que sus valores son los mismos es porque sus subconsultas se están agregando sobre todos los valores en todas las tablas, sin contar las cosas para un equipo específico.


0 para la respuesta № 2

tienes que ponerlo en una selección

SELECT team_instance.id, COUNT(dropkicks.id) * 3 + COUNT(penalty_kicks.id) * 3 as total
FROM team_instance
INNER JOIN player_instance ON team_instance.id = player_instance.team_instance_id
Left JOIN dropkicks ON player_instance.id = dropkicks.kicker_id and dropkicks.success = true
Left JOIN penalty_kicks ON player_instance.id = penalty_kicks.kicker_id and penalty_kicks.success = true
GROUP BY team_instance.id