2012-04-26 7 views
0

これは複雑なクエリですが、私はスヌーカーのマッチのデータベースを持っていて、誰が決定したフレームでプレーして勝ったのかに関する統計を生成しようとしています(ルールを心配しないでくださいあなたがゲームを知らない場合)。複数の列からのSELECT DISTINCT

表:私が何をしようとしています何

ID player1 player2 bestOf  player1Score  player2Score 
1 1   2   9   5     0 
2 2   1   9   5     4 
3 1   2   9   5     4 
4 2   1   9   4     5 

には、次のようなものです:

SELECT COUNT(*) AS played, DISTINCT(player1,player2) AS playerID 
FROM matches 
WHERE (player1Score=BestOf/2 + 0.5 AND player2Score=BestOf/2 - 0.5) 
GROUP BY playerID 

上記のクエリは動作しません、私はDISTINCT信じているように、複数の列をサポートしていません。 。私はトップテーブルから探している結果である:それが最後のフレームではないとして

playerID played won 
1   3  2 
2   3  1 

表の一番上の行は、表示されません。

SELECT GROUP(player1,player2) 
SELECT player1 + player2 AS playerID, select DISTINCT(playerID) 
SELECT (player1 + player2) AS playerID GROUP BY playerID 

と良いいくつかの他:

私は、次のようなバリエーションを試してみました。どんなヒントもありがとう!

+0

を取得するために、これらの2つのテーブルを結合:http://dev.mysql.com/doc/refman/5.5/en/string -functions.html#function_concat – Interrobang

+1

うーん、嫌なデザイン。データベースの正規化を学びます。心配しないで、それは[正規表現]ではありません(http://twitter.com/#!/shanselman/status/190543146323685377)、あなたはそれをかなり簡単に学ぶことができます:-) –

+0

プレイヤー1とプレイヤーはどのようにプレイできますか三つのゲームだけ。サンプルデータごとに、彼らは4試合に出場したようだ。プレイヤー1は3試合、プレイヤー2は1試合に勝った。 –

答えて

0

私のテーブルは実際には私のテーブルを持っていないので、おそらく私のSQLは構文エラーが多いでしょう。しかし、うまくいけば私は一般的な考え方を理解することになるだろう。 player1が獲得したフレームゲームの決定リストを計算し、player2が獲得したフレームゲームの決定リストと組み合わせることができます。勝者の列名を同じ文字列( 'player')に変更する限り、これらの表の和集合は、各人が勝った回数を示す単一の表を生成するはずです。

select player, count(*) as num_won from ((select player1 as player from matches where player1Score - player2Score = 1) union (select player2 as player from matches where player2Score - player1Score = 1)); 

これは、各プレイヤーのIDから獲得した回数にマッピングする必要があります。

は、その後、各プレイヤーがプレイし決定フレームゲームの数を発見に役立つはず

select player, count(*) as num_played from ((select player1 as player from matches where abs(player1Score - player2Score) = 1) union (select player2 as player from matches where abs(player2Score - player1Score) = 1)); 

abs関数の使用を検討してください。今、私たちは、あなたはおそらく `CONCAT()`を探しているあなたの最終的な答え

select players_table.player, players_table.num_played, winners_table.num_won from (select player, count(*) as num_won from ((select player1 as player from matches where player1Score - player2Score = 1) union (select player2 as player from matches where player2Score - player1Score = 1)) winners_table), (select player, count(*) as num_played from ((select player1 as player from matches where abs(player1Score - player2Score) = 1) union (select player2 as player from matches where abs(player2Score - player1Score) = 1)) players_table) where winners_table.player == players_table.player; 
+0

私はこれを試しましたが、派生テーブルのエラーを取得する、私はこれを見てみることがあります。ありがとう! – user1105971

+0

エラーをコピーして貼り付けできますか?作成されたすべての中間テーブルにエイリアスを付けましたか? –

+0

私はしませんでした、エラーは "#1248 - すべての派生テーブルは、独自のエイリアスを持っている必要があります"です。私はエイリアスに精通していない、私は周りにGoogle、それらを動作させる方法を見つけるとあなたに戻って取得します。ありがとう! – user1105971

0
create table temp_score 
select playerid, count(*) as won 
FROM(
    Select case when player1score > player2score then player1 else player2 end as playerid 
    from score 
    where 
    (player2Score=Round(BestOf/2 + 0.5,0) AND player1Score=round(BestOf/2 - 0.5,0)) 
    or 
    (player1Score=Round(BestOf/2 + 0.5,0) AND player2Score=round(BestOf/2 - 0.5,0)) 
) a 
group by playerid 

Select playerid,won, (Select SUM(won) from temp_score) as TotalPlayed from temp_score 
+0

私は1つのクエリでそれをやるのが好きですが、Score_Cteを実際のテーブル名に置き換えてMySQLでテストしましたが、これはエラーです: "#1064 - SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応しています。右の構文は、近くの 'matches'を使用するために使用されます(playeridを選択、COUNT(*)は(行1のときに選択します)。 – user1105971

+0

この回答はMS Sqlに関連しています。内部結果をテーブルに格納し、次にtempテーブルの2番目のクエリを実行して最終結果を得ます。 –

+0

MySQLは私が知る限りCTEを持っていません。 – vyegorov

関連する問題