2011-07-22 31 views
1

友人や私は、試合を記録したり、トーナメントを作成したり、これらのトーナメントの試合を記録できるPHPサイトを作成しています。SQLクエリGROUP BY?

特定のトーナメントで試合を表示して壁に当たっています。私たちは、PHPでそれをやってみましたが、それはトーナメント表を台無しに全く

我々我々は、次の列持つテーブルと呼ば試合があります。

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 

ID player1ID player2Id team1ID team2ID ScorePlayer1 ScorePlayer2 Date TournamentID 

は、今、私たちのようなテーブルを作りたいの

しかし、PHPではWLDとポイントのある行は決して一致しません。テーブル全体が奇妙です。

SQLコマンドでこれをどのように行うことができるのでしょうか? (非サッカー選手の場合:勝利x 3 pnts x 1 pntsの損失を引きます0 pnts

+6

サンプル*入力*データを追加できますか?これまでに何を試みましたか? – gbn

+2

誰もが1つのクエリでそのテーブルを生成することができますいくつかの神のような力を持っている必要があります... :) –

+1

あなたはまた、あなたが使用しているクエリを書くことができますか? – Kangkan

答えて

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の間のマッチを使いたいなら、ちょっとした魔法が必要です。