MySQL从结果表中显示团队排名

时间:2014-04-16 09:02:47

标签: php mysql

我有两张桌子:

teams
---------------------
team_id     team_name
---------------------
 1          Lakers
 2          Clippers
 3          Grizzlies
 4          Heat

results
...............................................................
game_id     team_id1    team_id2     team1_score    team2_score
   1            1           2             20             30  
   2            1           3             40             50
   3            2           1             50             60
   4            4           2             20             30
   5            1           2             20             30

我的问题是,如何根据按点排序的结果为这些表创建排名结果,如下所示:

...............................................................
Position    team_name    total_points    games_played
   1        Lakers           140               4
   2        Clippers         110               3 
   3        Grizzlies        50                1 
   4        Heat             20                1 

3 个答案:

答案 0 :(得分:3)

我想你想做的是这样的事情:

<强> EDITED

SET @num :=0; 
SELECT (@num := @num + 1) as Position,team_name,total_points,games_played
FROM (
  SELECT teams.team_name, SUM(p) as total_points, count(*) as games_played
    FROM (
      SELECT team_id1 as id, team1_score as p FROM results
      UNION ALL
      SELECT team_id2 as id, team2_score as p FROM results
   ) t
   INNER JOIN teams ON t.id = teams.team_id
   GROUP BY id,teams.team_name ) t2
ORDER BY total_points DESC;

SQLFiddle在这里:http://www.sqlfiddle.com/#!2/5bf2c/1

如果你想展示所有球队,即使有些球队没有参加过一场比赛,你也可以这样:

SET @num :=0; 
SELECT (@num := @num + 1) as Position,team_name,total_points,games_played
FROM (
  SELECT
    teams.team_name,
    SUM(p) as total_points,
    SUM(f) as games_played 
    FROM (
    SELECT team_id1 as id, team1_score as p, 1 as f FROM results
    UNION ALL
    SELECT team_id2 as id, team2_score as p, 1 as f FROM results
    UNION ALL
    SELECT team_id as id, 0 as p, 0 as f FROM teams
) t
INNER JOIN teams ON t.id = teams.team_id
GROUP BY id,teams.team_name ) t2
ORDER BY total_points DESC;

SQLFiddle在这里:http://www.sqlfiddle.com/#!2/8ecf5d/9

希望这有帮助。

答案 1 :(得分:0)

我可能已经重新命名了你的几个专栏......哦,第1和第2组是绑定的,所以你需要多说一些如何解决这个问题......

SELECT t.*
     , COUNT(*) p
     , SUM(score) pts
  FROM
     (
       SELECT home_team_id team_id,home_team_score score FROM results
       UNION ALL
       SELECT away_team_id,away_team_score FROM results
     ) x
  JOIN teams t
    ON t.team_id = x.team_id
 GROUP 
    BY t.team_id
 ORDER 
    BY pts DESC;

答案 2 :(得分:-1)

select team_id,team_name,sum(sc1) ,sum(ct1) from

(select team_id,teams.team_name,sc1,ct1 from
  (select team_id1,sum(team1_score)as sc1,count(team_id1) as ct1  from results group by team_id1) as srtbl1,teams
    where srtbl1.team_id1 =teams.team_id
  union
select team_id,teams.team_name,sc2,ct2 from
  (select team_id2,sum(team2_score)as sc2 ,count(team_id2) as ct2 from results group by team_id2) as srtbl2,teams
  where srtbl2.team_id2 =teams.team_id) sctbl

group by team_id;

我认为你在计算时犯了错误。