在足球环境中,我想显示当前的排名。含义:每个团队的得分和目标。相关表格类似于以下(简化)。
uid (PK) hometeamid roadteamid
------------------------------------------------------------------
uid (PK) hometeamscore roadteamscore resulttype (45min, 90min, ..)
-------------------------------------------------------------------
uid (PK) name shortname icon
------------------------------------------------------------------
现在我不介意,如何在一个查询中写下排名。我管理的是写一个查询,它只返回“homegames” - 排名。我想这很容易。无论如何这里是它的样子:
SELECT ht.name,
Count(*) As matches,
SUM(res.hometeamscore) AS goals,
SUM(res.roadteamscore) AS opponentgoals,
SUM(res.hometeamscore - res.roadteamscore) AS goalDifference,
SUM(res.hometeamscore > res.roadteamscore) * 3 + SUM(res.hometeamscore = res.roadteamscore) As Points
FROM league_league l
JOIN league_gameday gd
ON gd.leagueid = l.uid
JOIN league_match m
ON m.gamedayid = gd.uid
JOIN league_result res
ON res.matchid = m.uid
AND res.resulttype = 2
JOIN league_team ht
ON m.hometeamid = ht.uid
Where l.uid = 1
Group By ht.uid
Order By points DESC, goalDifference DESC
任何想法如何修改它,它将返回家园和道路游戏将是很大的时间赞赏。
非常感谢,
罗宾
答案 0 :(得分:1)
创建视图。如果您的数据不经常更改并且您需要性能,请创建一个或多个预先计算的表。
MySQL中的视图是从SELECT查询动态计算的juste伪表。使用问题中的SQL,您可以在家中创建团队结果的视图:CREATE VIEW homegames AS SELECT ...
然后对公路游戏做同样的事情。然后很容易在第三个视图中合成两个视图(您只需要总结列)。
观点至少有一个缺陷:它们很慢。构建在视图上的视图就像使用复杂的子查询一样,MySQL在这方面非常糟糕。我不认为这对你来说是一个问题,因为你最多可能会处理数百个游戏。但是,如果您发现这些视图查询速度太慢,并且假设您不使用任何可以缓解此问题的缓存,则使用简单表而不是视图。当然,你需要让它们保持同步。每次有新游戏时,您都可以TRUNCATE
和INSERT INTO homegames SELECT ...
,或者您可以更智能,只需UPDATE
个表格。两者都是正确的,取决于您的需求。
答案 1 :(得分:0)
您是否可以将其抽象为存储过程或存储函数来调用而不是构建这样一个大问题复杂的查询?