我一直试图找到关于这个主题的东西,我似乎找不到任何东西,这里有几个问题,但它们对我的特定项目不起作用。
我问了一个关于更新表的类似问题,但它不能用于我真正想要的东西 这是结果列表。
--------------------------------------------------------
|id | hometeam |goalsfor|goalsagainst| awayteam |
--------------------------------------------------------
| 1 |Inter Milan | 3 | 1 | FC Barcelona |
--------------------------------------------------------
| 2 |FC Barcelona | 1 | 0 | Inter Milan |
--------------------------------------------------------
| 3 |Inter Milan | 4 | 0 | AC Milan |
--------------------------------------------------------
| 4 |AC Milan | 0 | 2 | Inter Milan |
--------------------------------------------------------
| 5 |Real Madrid | 2 | 0 | AC Milan |
--------------------------------------------------------
| 6 |AC Milan | 2 | 2 | Real Madrid |
--------------------------------------------------------
| 7 |FC Barcelona | 2 | 2 | AC Milan |
--------------------------------------------------------
| 8 |Real Madrid | 2 | 0 | Inter Milan |
--------------------------------------------------------
| 9 |Inter Milan | 3 | 1 | Real Madrid |
--------------------------------------------------------
| 10 |FC Barcelona | 2 | 0 | Real Madrid |
--------------------------------------------------------
| 11 |Real Madrid | 1 | 1 | FC Barcelona |
--------------------------------------------------------
基本上我希望能够按顺序创建排名表的排名表,我希望动态呈现此表而不是将其放入数据库
Pos Team Pld W D L F A GD Pts
1 FC Barcelona 5 2 3 0 8 5 3 9
2 Inter Milan 6 2 2 2 11 10 1 8
3 Real Madrid 6 2 2 2 8 8 0 8
4 AC Milan 5 0 3 2 8 12 -4 3
POS =位置W =赢得D =平局L =损失F =目标得分A =目标得分与GD =目标差异Pts =得分
我认为最有效的方法是分配胜利,平局和失利,将得分和进球数相加,并在回显数据时计算 - 计算比赛总数和得分。
但是我如何分配胜利或亏损呢?并计算得分和目标?
答案 0 :(得分:16)
首先将得分表联合在一起,将家庭主队与客队交换并交换目标数。这为您提供了一些易于聚合的源数据,并且生成记分卡的查询是这样的:
select
team,
count(*) played,
count(case when goalsfor > goalsagainst then 1 end) wins,
count(case when goalsagainst> goalsfor then 1 end) lost,
count(case when goalsfor = goalsagainst then 1 end) draws,
sum(goalsfor) goalsfor,
sum(goalsagainst) goalsagainst,
sum(goalsfor) - sum(goalsagainst) goal_diff,
sum(
case when goalsfor > goalsagainst then 3 else 0 end
+ case when goalsfor = goalsagainst then 1 else 0 end
) score
from (
select hometeam team, goalsfor, goalsagainst from scores
union all
select awayteam, goalsagainst, goalsfor from scores
) a
group by team
order by score desc, goal_diff desc;
答案 1 :(得分:3)
// connection stuff
$sql = 'select * from matchesTable';
$result = mysql_query($sql)
$standings = array ();
$standingTemplate = array ('matches' => 0, 'wins' => 0, 'draws' => 0, 'losses' => 0, 'goalsfor' => 0, 'goalsagainst' => 0, 'goalsdiff' => 0, 'points' => 0);
while ($row = mysql_fetch_assoc($result))
{
handleMatch($row['hometeam'], $row['goalsfor'], $row['goalsagainst']);
handleMatch($row['awayteam'], $row['goalsfor'], $row['goalsagainst']);
print_r( usort(standings, 'comparePoints') ); // up to you to format the output as you like
}
function handleMatch($team, $goalsfor, $goalsagainst)
{
global $standings, $standingTemplate;
if ($goalsfor > $goalsagainst)
{
$points = 3;
$win = 1;
$draw = 0;
$loss = 0;
}
elsif ($goalsfor == $goalsagainst)
{
$points = 1;
$win = 0;
$draw = 1;
$loss = 0;
}
else
{
$points = 0
$win = 0;
$draw = 0;
$loss = 1;
}
if ( empty($standings[$team]) )$standing = $standingTemplate;
else $standing = $standings[$team];
$standing['matches']++;
$standing['wins'] += $win;
$standing['draws'] += $draw;
$standing['losses'] += $loss;
$standing['goalsfor'] += $goalsfor;
$standing['goalsagainst'] += $goalsagainst;
$standing['goalsdiff'] += $goalsfor - $goalsagainst;
$standing['points'] += $points;
$standings[$team] = $standing;
}
function comparePoints($a, $b)
{
if ($a['points'] == $b['points'])
{
if ($a['goalsdiff'] == $b['goalsdiff']) return 0;
return ($a['goalsdiff'] < $b['goalsdiff']) ? 1 : -1 ;
}
return ($a['points'] < $b['points']) ? 1 : -1 ;
}
注意:我没有对它进行测试,可能是小错误(某些$
或;
丢失)。
答案 2 :(得分:1)
最近,我不得不制作数据表的扩展版本。尽管它是基于我自己的模式,但是它可能对某人有用(它基于以前的答案):
SELECT
team_id team_id,
t.name team_name,
t.country country,
count(*) matches,
SUM(scored) scored_total,
SUM(conceided) conceided_total,
count(CASE WHEN scored > conceided
THEN 1 END) wins,
count(CASE WHEN scored = conceided
THEN 1 END) draws,
count(CASE WHEN scored < conceided
THEN 1 END) lost,
sum(scored) - sum(conceided) balance,
sum(
CASE WHEN scored > conceided
THEN 3
ELSE 0 END
+ CASE WHEN scored = conceided
THEN 1
ELSE 0 END) points,
count(CASE WHEN place = 'home'
THEN 1 END) home_matches,
count(CASE WHEN place = 'home' AND scored > conceided
THEN 1 END) home_wins,
count(CASE WHEN place = 'home' AND scored = conceided
THEN 1 END) home_draws,
count(CASE WHEN place = 'home' AND scored < conceided
THEN 1 END) home_lost,
SUM(CASE WHEN place = 'home'
THEN scored
ELSE 0 END) home_scored,
SUM(CASE WHEN place = 'home'
THEN conceided
ELSE 0 END) home_conceided,
count(CASE WHEN place = 'away'
THEN 1 END) away_matches,
count(CASE WHEN place = 'away' AND scored > conceided
THEN 1 END) away_wins,
count(CASE WHEN place = 'away' AND scored = conceided
THEN 1 END) away_draws,
count(CASE WHEN place = 'away' AND scored < conceided
THEN 1 END) away_lost,
SUM(CASE WHEN place = 'away'
THEN scored
ELSE 0 END) away_scored,
SUM(CASE WHEN place = 'away'
THEN conceided
ELSE 0 END) away_conceided,
GROUP_CONCAT((CASE
WHEN scored > conceided
THEN 'W'
WHEN scored = conceided
THEN 'D'
WHEN scored < conceided
THEN 'L'
END) ORDER BY date ASC separator '') streak
FROM
(
(SELECT
hm.date date,
hm.home_team_id team_id,
hm.score_home scored,
hm.score_away conceided,
'home' place
FROM matches hm
WHERE hm.season_id = :seasonId)
UNION ALL
(SELECT
am.date date,
am.away_team_id team_id,
am.score_away scored,
am.score_home conceided,
'away' place
FROM matches am
WHERE am.season_id = :seasonId)
) m
JOIN teams t ON t.id = team_id
GROUP BY team_id
ORDER BY points DESC, balance DESC;