简体   繁体   中英

MySQL display team standings from results table

I have two tables:

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

My question is, how can I then create standings results for this tables based on results sorted by points, like this:

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

I guess what you would like to do is something like this:

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 is here : http://www.sqlfiddle.com/#!2/5bf2c/1

If you would like to display all teams, even if some teams did not play a single game, you could go like this:

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 is here: http://www.sqlfiddle.com/#!2/8ecf5d/9

Hope this helps.

I may have renamed a couple of your columns... oh, and teams 1 and 2 are tied so you need to say a little more about how to resolve that...

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;
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;

and I think you make a mistake in calculating .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM