Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用分数查询胜负_Mysql_Sql - Fatal编程技术网

Mysql 用分数查询胜负

Mysql 用分数查询胜负,mysql,sql,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 获胜的队

如果我有一张桌子:

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

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

诀窍在于,给定的队可能出现在两列中的一列。您可以使用UNION解决这个问题,其中UNION的第二个表只需交换第一个表中的列。之后,它只是一个简单的分组:

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
顺便说一句,我很久以前就研究过这样一个数据库系统,它有一个带有成对记录的表。这不是比赛结果,而是配对数据。我们发现,为每场比赛存储两条记录的性能要高得多。一场比赛的两条记录将共享一个共同的比赛id,但与球队的排列顺序相反。前端代码和后端维护任务用于确保配对记录正确存储

这使得我们需要更高效地执行某些查询,因为我们可以对表进行一次索引,然后只需查看相应的team_列,就可以从表中为特定的团队进行选择。再说一次,这不是体育数据,所以你的结果可能会有所不同,但我们确实发现,在我们的问题空间中,它的效果要好得多


在旧系统中,这种效率的部分原因是,一旦输入,配对数据很少改变。这似乎很适合你所做的事情。

你试过什么吗?B队的得分不应该是5分吗?B赢了两次和A一样…你们怎么算平局?