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 № 1Debe 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