0

シンプルなプレイヤー プロフィール Web サイトを作成しようとしていますが、SQL で問題が発生しています。

プレーヤー テーブルと以前のクラブ テーブルがあります。これは多対多の関係であるため、プレーヤーと以前のクラブのテーブルの間にルックアップ テーブル (プレーヤーの以前のクラブ) を使用しています。

次のようなSQLを実行するまで、これはすべて正常に機能しているように見えました。

SELECT player.id, player.name AS name, age, position, height, weight, previousclubs.name AS previousclubs, satscore, gpa
FROM player 
INNER JOIN playerpreviousclubs
ON player.id = playerid
INNER JOIN previousclubs
ON previousclubid = previousclubs.id

問題は、プレーヤーが複数の以前のクラブを持っている場合、すべての情報 (以前のクラブを除く) が重複するため、このような結果になることです。

結果セット 1

Name: John Smith
Age: 23
Previous Clubs: Arsenal

結果セット 2

Name: John Smith
Age: 23
Previous Clubs: Reading

私がやりたいことは次のとおりです。

結果セット 1

Name: John Smith
Age: 23
Previous Clubs: Arsenal, Reading

これが現在起こっている理由と、それを修正する方法を教えてください。

ありがとう

4

1 に答える 1

1

希望する動作を実現するには、GROUP BY を集計関数と組み合わせて使用​​する必要があります (つまり、DB から取得した n タプルを「集計」する必要があるため、関数は集計と呼ばれます :-))。集計関数の選択は、使用している RDBMS によって異なります。次に例を示します。

MySQL:

SELECT player.id, player.name AS name, GROUP_CONCAT(previousclubs.name)
FROM player
INNER JOIN playerpreviousclubs ON player.id = playerid
INNER JOIN previousclubs ON previousclubid = previousclubs.id
GROUP BY player.id, player.name

PostgreSQL (v8.4 以降):

SELECT player.id, player.name AS name, array_agg(previousclubs.name)
FROM player
INNER JOIN playerpreviousclubs ON player.id = playerid
INNER JOIN previousclubs ON previousclubid = previousclubs.id
GROUP BY player.id, player.name
于 2012-08-20T14:16:56.640 に答える