使用分数查询胜利和损失

时间:2014-03-19 19:06:21

标签: mysql sql

如果我有桌子:

matches

id
team_one
team_two
one_score
two_score

如何查询给我以下结果:

Team A 

    Win: 2   Lose:  0  Score: 5


Team B

    Win: 2   Lose:  0  Score: 3


Team C

    Win:  1  Lose:  1  Score: 3


Team D

    Win:  0  Lose:  2  Score: 1

获胜的团队在表中得分较高。

1 个答案:

答案 0 :(得分:3)

诀窍是给定的团队可能出现在两个不同的列之一。您可以使用UNION解决此问题,其中联合的第二个表只是交换第一个表中的列。之后,它只是一个简单的GROUP BY:

SELECT team, SUM(Win) As Won, SUM(Loss) as Lost, SUM(score) as Score
FROM
( SELECT team_one as team, 
     CASE WHEN one_score > two_score THEN 1 ELSE 0 END as Win, 
     CASE WHEN one_score < two_score THEN 1 ELSE 0 END as Loss, one_score as score
  FROM matches
  UNION ALL
  SELECT team_two as team
     CASE WHEN two_score > one_score THEN 1 ELSE 0 END as Win, 
     CASE WHEN two_score < one_score THEN 1 ELSE 0 END as Loss, two_score as score
  FROM matches
) t
GROUP BY team
ORDER By Won, Lost DESC, Score

顺便说一句,我很久以前就开始研究像这样的数据库系统,它有一个配对记录的表。这不是竞争结果,而是配对数据。我们发现每个&#34;匹配&#34;存储两个记录的性能更高很多。匹配的两个记录将共享一个共同的match_id,但会反转&#34; team&#34;被列出。前端代码和后端维护任务用于保证配对记录的正确存储。

这使我们需要更高效地执行某些查询,因为我们可以将表索引一次,并通过查看其等效的team_one列从特定团队的表中进行选择。同样,这不是体育数据,因此您的结果可能会有所不同,但我们确实找到了我们的问题空间,它可以更好地工作

在旧系统中使这种方法有效的部分原因是,一旦输入,配对数据很少改变。这似乎非常适合您正在做的事情。