SQL查询GROUP BY?

时间:2011-07-22 12:26:54

标签: php mysql sql

我和一些朋友正在编写一个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

1 个答案:

答案 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之间使用匹配来订购结果,你需要一点魔力。