如果我有桌子:
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
获胜的团队在表中得分较高。
答案 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列从特定团队的表中进行选择。同样,这不是体育数据,因此您的结果可能会有所不同,但我们确实找到了我们的问题空间,它可以更好地工作 。
在旧系统中使这种方法有效的部分原因是,一旦输入,配对数据很少改变。这似乎非常适合您正在做的事情。