2012-02-21 10 views
0

現在、私は小さなスクリプトを書いています。今朝以来立ち往生しています。MySQL 3行をマージして結果を数える方法は?

id | player1 | player2 | player3

サンプル行:

はここに私のフィールドです
1 | toto | - | -
2 | tata | toto | -
3 | titi | tutu | -
4 | tata | titi | toto

私は行player1、player2、player3をマージし、エントリ数をカウントできるようにしたいと思い

、私が与えた例の行によれば、このようなトップを得るために: toto 3 tata 2 tutu 2 titi 1

私は通常、基本的な質問を書いています。そのために、私は本当に立ち往生していて、何時間も物事を試しています。私が望むものを得ることはできません。

+0

すべてのプレーヤーを一覧表示するテーブルがありますか? – penartur

+0

「player1 ...」という列をマージできるようにしたいのですか? –

+0

@ penartur:いいえ、リストなし、すべてがテーブルにあります。 @ Mosty Mostacho:私が必要とするのは、player1、player2、またはplayer3の行にあるかどうかにかかわらず、すべてのプレイヤーのリストを取得し、リストされている回数をカウントして、レコードの最大数。 – badkarma

答えて

0
select count(*) from ((select id,player1 as players from tablename) union (select id,player2 as players from tablename) union (select id,player3 as players from tablename)) as dummytable group by players 

私がテストしたけど、ロジックを見ていない:)

+0

Upvoteこの回答があなたのロジックを形成するのに役立つなら! – Akshay

2

あなたが何かに出始めているかのように、それは読み込み、すでにデータベース設計は非常に非正規化パフォーマンスの問題につながる可能性がありますラインを下ろす。これを減らすために、私はあなたがずっと前になる前にリストラを検討することを提案します。プレーヤ1、プレーヤ2、プレーヤ3は全てプレーヤであり、正規化することができる。あなたの既存のテーブルの各行はgameまたはこれと類似しているとみなすことができ、正規化することができます。あなたは、プレイヤーをゲームにリンクさせるタスクを提示されたばかりです。そうすれば、同じプレーヤーの詳細を複数回保存することはなく、最初の挿入がもう少し複雑であっても、テーブルに対するすべてのクエリは長期的にはより高速になります。

players (
    id INT UNSIGNED PK AI, 
    name VARCHAR 
    .... other player data .... 
) 

// Assumed a name here 
games (
    id INT UNSIGNED PK AI 
    .... game data .... 
) 

// Note the 2-field primary key here. Prevents 1 player being in the same game twice. 
playersInGames (
    game_id INT UNSIGNED PK, 
    player_id INT UNSIGNED PK, 
    playerNumber TINYINT UNSIGNED // You don't even need this, if you don't care about player number assigments just don't include this column 
) 

例データ

// players 
id  name 
1  toto 
2  tata 
3  titi 
4  tutu 

// games 
id 
1 
2 
3 
4 

// playersInGames 
game_id  player_id  playerNumber 
1   1    1 
2   2    1 
2   1    2 
3   3    1 
3   4    2 
4   2    1 
4   3    2 
4   1    3 

これは、順番に、あなたは、このような

SELECT 
    p.*, 
    COUNT(DISTINCT pig.game_id) AS gamesPlayerIsIn 
FROM players AS p 
LEFT JOIN playersInGames AS pig 
ON pig.player_id = p.id 
GROUP BY p.id 

編集あなたが本当にテーブルスキーマを変更したくない場合など単純なクエリをやらせるだろう次のようにすれば十分ですが、あなたのコードを守る者は誰でも泣かせます。それは、各プレイヤーをテーブル行ごとに1回カウントします。

SELECT 
    players.playerName, 
    COUNT(DISTINCT players.id) AS numberOfRows 
FROM (
    (
     SELECT DISTINCT id, player1 AS playerName FROM tableName 
    ) UNION DISTINCT (
     SELECT DISTINCT id, player2 AS playerName FROM tableName 
    ) UNION DISTINCT (
     SELECT DISTINCT id, player3 AS playerName FROM tableName 
    ) 
) AS players 
+0

これがどのように行われるべきか、正しい方法です – Kaii

関連する問題