我正在为棒球队做一个联赛桌。假设我有以下2个DB表:
小组
ID | NAME
---------------------------
1 | Phillies
2 | Yankees
3 | Red Sox
游戏
ID | TEAM1_ID | TEAM2_ID | TEAM1_SCORE | TEAM2_SCORE
----------------------------------------------------
1 | 2 | 1 | 12 | 8
2 | 3 | 2 | 9 | 14
3 | 1 | 2 | 10 | 5
我希望MySQL能够列出所有团队及其结果。这包括总比赛,赢球和输球。
有谁知道如何做到这一点?
例如,结果集可能如下所示:
team_name | total_played | total_won | total_lost
-------------------------------------------------
Phillies | 2 | 1 | 1
Yankees | 3 | 2 | 1
Red Sox | 1 | 0 | 1
谢谢!
答案 0 :(得分:2)
这是使用conditional aggregation
的一个选项:
select t.name,
count(g.id) total_played,
sum(case when (t.id = team1_id and team1_score > team2_score) then 1
when (t.id = team2_id and team2_score > team1_score) then 1
else 0
end) total_won,
sum(case when (t.id = team1_id and team1_score < team2_score) then 1
when (t.id = team2_id and team2_score < team1_score) then 1
else 0
end) total_lost
from teams t
left join games g on t.id in (g.team1_id, g.team2_id)
group by t.name
答案 1 :(得分:1)
您可以这样做:
int guesssum; //declare this
.
.
if (int.TryParse(txtUserAnswer.Text, out guesssum)) //use guesssum here
{
if (guesssum == sum){
MessageBox.Show("Correct Answer!", "Correct");
correct++;
}
else {
//wrong, do something!
}
}
这基本上可以让游戏桌更舒适地使用,使每个团队的记录倍增,因此计数很容易,并且不必检查多个条件。
答案 2 :(得分:1)
这可能与sgeddes解决方案相同。
我把条件放在子查询中,所以我可以先测试内部结果
<强> SQL Fiddle Demo 强>
SELECT t.`NAME`,
SUM(play) as total,
SUM(WON) as games_won,
SUM(LOST) as games_lost,
SUM(SCORE) as total_score
FROM (
SELECT t.`NAME`,
IF(g.`TEAM1_ID`IS NULL, 0, 1) as play,
CASE WHEN t.`ID` = g.`TEAM1_ID` AND TEAM1_SCORE > TEAM2_SCORE THEN 1
WHEN t.`ID` = g.`TEAM2_ID` AND TEAM1_SCORE < TEAM2_SCORE THEN 1
ELSE 0
END as WON,
CASE WHEN t.`ID` = g.`TEAM1_ID` AND TEAM1_SCORE < TEAM2_SCORE THEN 1
WHEN t.`ID` = g.`TEAM2_ID` AND TEAM1_SCORE > TEAM2_SCORE THEN 1
ELSE 0
END as LOST,
CASE WHEN t.`ID` = g.`TEAM1_ID` THEN TEAM1_SCORE
WHEN t.`ID` = g.`TEAM2_ID` THEN TEAM2_SCORE
ELSE 0
END as SCORE
FROM teams t
LEFT JOIN games g
ON t.`ID` = g.`TEAM1_ID`
OR t.`ID` = g.`TEAM2_ID`
) T
GROUP BY t.`NAME`
<强>输出强>
| NAME | total | games_won | games_lost | total_score |
|----------|-------|-----------|------------|-------------|
| Phillies | 2 | 1 | 1 | 18 |
| Red Sox | 1 | 0 | 1 | 9 |
| Some | 0 | 0 | 0 | 0 |
| Yankees | 3 | 2 | 1 | 31 |
答案 3 :(得分:0)
这样的事情应该有效:
select id, name,
(select count(*) from games where team1_id = id OR team2_id = id) as total_played,
(select count(*) from games where (team1_id = id and team1_score > team2_score) OR (team2_id = id and team1_score < team2_score)) as total_won,
(select count(*) from games where (team1_id = id and team1_score < team2_score) OR (team2_id = id and team1_score > team2_score)) as total_lost
from teams
Here是SQL小提琴。