あなたが何かに出始めているかのように、それは読み込み、すでにデータベース設計は非常に非正規化パフォーマンスの問題につながる可能性がありますラインを下ろす。これを減らすために、私はあなたがずっと前になる前にリストラを検討することを提案します。プレーヤ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
すべてのプレーヤーを一覧表示するテーブルがありますか? – penartur
「player1 ...」という列をマージできるようにしたいのですか? –
@ penartur:いいえ、リストなし、すべてがテーブルにあります。 @ Mosty Mostacho:私が必要とするのは、player1、player2、またはplayer3の行にあるかどうかにかかわらず、すべてのプレイヤーのリストを取得し、リストされている回数をカウントして、レコードの最大数。 – badkarma