简体   繁体   中英

SQL Query GROUP BY?

Some friends and I are writing a php site where we can log our matches, create tournaments and log matches for these tournaments etc.

We hit a wall with displaying our matches for a certain tournament. We tried doing it with php but that messes up the tournament table totally

We have a table called matches where we have following columns:

ID  player1ID player2Id  team1ID team2ID ScorePlayer1 ScorePlayer2  Date TournamentID

Now we want to make tables like:

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

But with php the rows with WLD and points never match, the whole table is weird.

Anyone have an idea of how we can do this with an SQL command? (for non-soccer people: wins x 3 pnts Draws x 1 pnts losses 0 pnts

I don't know if mysql with php still shuns subqueries but the following might have a chance of working. I'll test it later on as I don't have the time at the moment. I just though I'd give you some ideas.

If the subqueries do not work then you could create a view of the subquery and proceed from there.

I'm also not sure if mysql supports column names that are expressed using double quotes ( "+/-" )

The basic idea is to select the score separately for home games and visiting games. Aggregate functions allow usually allow case statements within them that allows you to do a bit magic.

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

Edit: I forgot to order the results. You need a bit magic if you want to use matches between players A and B to order the results in case of a tie.

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