2017-04-01 2 views
0

Je produis un tableau de classement pour les équipes de speedway, j'ai une requête pour calculer les données requises en fonction des résultats des équipes. La partie que je me bats avec la différence de points (différence entre les points marqués et marqués contre.variables utilisateur dans un calcul

SELECT tbl_clubs.club, tbl_clubs.club_id, 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away AND tbl_fixtures.awayscore is not null ,1,0)) + 
SUM(if(tbl_clubs.club_id = tbl_fixtures.home AND tbl_fixtures.homescore is not null,1,0)) as `M`, 
SUM(if(tbl_clubs.club_id = tbl_fixtures.home 
AND tbl_fixtures.homescore > tbl_fixtures.awayscore, 1, 0)) AS `W`, 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.home AND tbl_fixtures.awayscore = tbl_fixtures.homescore, 1, 0)) AS `HD`, 
SUM(if(tbl_clubs.club_id = tbl_fixtures.home 
AND tbl_fixtures.homescore < tbl_fixtures.awayscore, 1, 0)) AS `HL`, 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore > tbl_fixtures.homescore 
AND tbl_fixtures.awayscore - tbl_fixtures.homescore >=7,1,0)) AS `4W`, 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore > tbl_fixtures.homescore 
AND tbl_fixtures.awayscore - tbl_fixtures.homescore <=6,1,0)) AS `3W`, 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.away AND tbl_fixtures.awayscore = tbl_fixtures.homescore, 1, 0)) AS `AD`, 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore < tbl_fixtures.homescore 
AND tbl_fixtures.homescore - tbl_fixtures.awayscore <=6,1,0)) AS `1L`, 

SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore < tbl_fixtures.homescore 
AND tbl_fixtures.homescore - tbl_fixtures.awayscore >=7,1,0)) AS `L`, 

@FOR:=SUM(IF(tbl_clubs.club_id = tbl_fixtures.away,tbl_fixtures.awayscore,0)) + 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.home,tbl_fixtures.homescore,0)) as `F`, 


@Against:=SUM(IF(tbl_clubs.club_id = tbl_fixtures.home,tbl_fixtures.awayscore,0)) + 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.away,tbl_fixtures.homescore,0)) as `A`, 

SUM(@For - @Against) as `PtsDiff`, 

SUM(if(tbl_clubs.club_id = tbl_fixtures.home 
AND tbl_fixtures.homescore > tbl_fixtures.awayscore, 3, 0)) + 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.home AND tbl_fixtures.awayscore = tbl_fixtures.homescore, 1, 0)) + 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore > tbl_fixtures.homescore 
AND tbl_fixtures.awayscore - tbl_fixtures.homescore >=7,4,0)) + 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore > tbl_fixtures.homescore 
AND tbl_fixtures.awayscore - tbl_fixtures.homescore <=6,3,0)) + 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.away AND tbl_fixtures.awayscore = tbl_fixtures.homescore, 2, 0)) + 
SUM(if(tbl_clubs.club_id = tbl_fixtures.away 
AND tbl_fixtures.awayscore < tbl_fixtures.homescore 
AND tbl_fixtures.homescore - tbl_fixtures.awayscore <=6,1,0)) as `Pts` 
FROM tbl_clubs 
INNER JOIN tbl_fixtures ON tbl_clubs.club_id = tbl_fixtures.home 

OR tbl_clubs.club_id = tbl_fixtures.away 
where tbl_clubs.league_id = 3 
GROUP BY tbl_clubs.club_id 
order by Pts desc, PtsDiff desc, club asc 

Toute la requête travaille à l'exception des

@FOR:=SUM(IF(tbl_clubs.club_id = tbl_fixtures.away,tbl_fixtures.awayscore,0)) + 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.home,tbl_fixtures.homescore,0)) as `F`, 


@Against:=SUM(IF(tbl_clubs.club_id = tbl_fixtures.home,tbl_fixtures.awayscore,0)) + 
SUM(IF(tbl_clubs.club_id = tbl_fixtures.away,tbl_fixtures.homescore,0)) as `A`, 

SUM(@For - @Against) as `PtsDiff`, 

Je reçois NULL comme résultat pour cette , Je suppose que c'est quelque chose de simple, toute aide serait grande

Répondre

0

Tout d'abord, vous voulez vous assurer que les valeurs nulles par défaut toujours à 0 et non null.Ceci est quelque chose qui pourrait arriver dans votre script, vous devez donc vous assurer 0 est le seul défaut viable. cur avant que cette requête soit exécutée bien idéalement. Il ne semble pas que ce soit le cas sur la base de votre script, alors vous voudrez peut-être vous assurer que vous avez conçu votre base de données pour répondre à cela. Deuxièmement, l'assignation de variables à l'intérieur des requêtes n'est pas aussi directe que vous le souhaiteriez. Vous pouvez être mieux à l'aide d'un sous-requête pour votre initialisations:

@FOR:=(select IFNULL(SUM(tbl_fixtures.awayscore),0) from tbl_fixtures where tbl_clubs.club_id = tbl_fixtures.away) + 
     (select IFNULL(SUM(tbl_fixtures.homescore),0) from tbl_fixtures where tbl_clubs.club_id = tbl_fixtures.home) 
as `F`, 
@Against:=(select IFNULL(SUM(tbl_fixtures.awayscore),0) from tbl_fixtures where tbl_clubs.club_id = tbl_fixtures.home) + 
     (select IFNULL(SUM(tbl_fixtures.homescore),0) from tbl_fixtures where tbl_clubs.club_id = tbl_fixtures.away) 
as `A`, 
SUM(@FOR - @Against) as `PtsDiff`, 

Pas très élégant, mais cela devrait fonctionner. Notez l'utilisation de IFNULL pour vous assurer que la valeur null est convertie en 0.