我和一些朋友正在编写一个php网站,我们可以在这里记录我们的比赛,创建锦标赛并记录这些锦标赛的比赛等。
我们在某场锦标赛中展示了我们的比赛。我们尝试用php做这件事,但这完全搞砸了锦标赛表
我们有一个名为matches的表,我们有以下列:
ID player1ID player2Id team1ID team2ID ScorePlayer1 ScorePlayer2 Date TournamentID
现在我们要制作如下表格:
GPl W L D + - +/- Pnts
Nielsen 6 1 3 2 3 6 -3 13
Chibax 6 2 1 3 4 3 1 9
Verre 6 1 3 2 3 6 -3 5
Hermie 6 4 1 1 7 2 5 5
但是对于php,W L D和点的行永远不会匹配,整个表格很奇怪。
任何人都知道如何使用SQL命令执行此操作? (对于非足球运动员:获胜x 3 pnts得到x 1 pnts损失0 pnts
答案 0 :(得分:3)
我不知道带有php的mysql是否仍会避开子查询,但以下内容可能有效。我稍后会测试它,因为我现在没有时间。我只是想给你一些想法。
如果子查询不起作用,那么您可以创建子查询的视图并从那里继续。
我也不确定mysql是否支持使用双引号表达的列名("+/-"
)
基本思路是分别为家庭游戏和访问游戏选择分数。聚合函数允许通常允许其中的case语句允许你做一些魔术。
SELECT
player,
SUM(M) M,
SUM(W) W,
SUM(E) E,
SUM(D) D,
SUM("+") "+",
SUM("-") "-",
SUM("+/-") "+/-",
SUM(Pnts) Pnts
FROM (
SELECT
player1ID player,
count(*) M,
SUM(case when ScorePlayer1 > ScorePlayer2 then 1 end) W,
SUM(case when ScorePLayer1 < ScorePlayer2 then 1 end) E,
SUM(case when ScorePlayer1 = ScorePlayer2 then 1 end) D
SUM(ScorePlayer1) "+",
SUM(ScorePlayer2) "-",
SUM(ScorePlayer1) - SUM(ScorePlayer2) "+/-",
SUM(case when ScorePlayer1 > ScorePlayer2 then 1 end) * 3 +
SUM(case when ScorePLayer1 < ScorePlayer2 then 1 end) Pnts
FROM
someTable
GROUP BY
player1ID
UNION ALL
SELECT
player2ID player,
count(*) M,
SUM(case when ScorePlayer2 > ScorePlayer1 then 1 end) W,
SUM(case when ScorePLayer2 < ScorePlayer1 then 1 end) E,
SUM(case when ScorePlayer2 = ScorePlayer1 then 1 end) D
SUM(ScorePlayer2) "+",
SUM(ScorePlayer1) "-",
SUM(ScorePlayer2) - SUM(ScorePlayer1) "+/-",
SUM(case when ScorePlayer2 > ScorePlayer1 then 1 end) * 3 +
SUM(case when ScorePLayer2 < ScorePlayer1 then 1 end) Pnts
FROM
someTable
GROUP BY
player2Id
) scoresheet
ORDER BY
Pnts desc,
M asc,
"+/-" desc,
"+" desc,
"-" asc
编辑:我忘了订购结果了。如果你想在玩家A和B之间使用匹配来订购结果,你需要一点魔力。