1

この問題の解決策を検索する方法さえよくわからないため、具体的なものが見つからなかったので、ここに行きます...

私は4つのテーブルを持っています。それらを単純化しましょう:

  players
  =======
  id    name    surname
  1     John    Arbuckle
  2     Walter  White
  3     Don Draper
  4     Louis   CK
  5     Tyrion  Lannister
  6     Abed    Nadir

  sports
  ======
  id    sport
  1     football
  2     handball

  positions
  =========
  id    name    sport_id
  1     goalie  1
  2     defense 1
  3     attack  1
  4     goalie  2
  5     pivot   2
  6     wing    2
  7     center  2

  player_position
  ===============
  player_id position_id
  1         1
  1         2
  1         5
  2         7
  2         5
  3         2
  4         2
  5         1
  5         3
  6         7
  6         5

したがって、プレーヤーは複数のスポーツを複数のポジションでプレイできます。まず、特定のスポーツの選手のリストを表示する必要があります。これには、彼らがプレーするポジションの列が含まれます。

私が始めたのは、これらのテーブルを結合し、プレーヤー ID ごとに複数の行を持つ JOIN ステートメントです。それは近いですが、あまり正しくありません。そして、私が取得する必要があるのは、次のようなテーブルです。

フットボール

    ID  name    surname     position
    1   John    Arbuckle    PHP array(goalie,defense)

ハンドボール

    ID  name    surname     position
    1   John    Arbuckle    PHP array(pivot)

編集:私が探していたのは GROUP_CONCAT() でした。みんなありがとう!

4

3 に答える 3

2
select p.id, p.name, p.surname, group_concat(po.name)
from players p 
inner join player_position pp on pp.player_id = p.id
inner join positions po on po.id = pp.position_id
inner join sports s on s.id = po.sport_id
where s.sport = 'football'
group by p.id

このSQLFiddle の例を参照してください

于 2012-05-20T14:56:09.860 に答える
1

これが誰にでもできるかどうかはわかりません (テストされていません) が…</p>

SELECT pp.`player_id` AS 'ID',s.`id` AS 'sport_id',s.`sport`,ps.`name` AS 'position',pl.`name`,pl.`surname` FROM `sports` s
INNER JOIN `positions` ps ON s.`id`=ps.`sport_id`
INNER JOIN `player_position` pp ON pp.`position_id`=ps.`id`
INNER JOIN `players` pl ON pl.`id`=pp.`player_id`
ORDER BY s.`id`,pp.`player_id`,ps.`id`

より詳細なバージョンは次のとおりです。

SELECT
    s.`id` AS 'sport_id',s.`sport`,
    ps.`id` AS 'position_id',ps.`name` AS 'position',
    pl.`id` AS 'player_id',pl.`name`,pl.`surname`
FROM `sports` s
INNER JOIN `positions` ps ON s.`id`=ps.`sport_id`
INNER JOIN `player_position` pp ON pp.`position_id`=ps.`id`
INNER JOIN `players` pl ON pl.`id`=pp.`player_id`
ORDER BY s.`id`,pp.`player_id`,ps.`id`
于 2012-05-20T14:44:04.000 に答える
1

サッカーの場合:

SELECT players.name, players.surname, positions.name 
FROM players, sports, positions, player_position 
WHERE sports.id = 1 AND positions.sport_id = sports.id AND payer_position.position_id = positions.id AND players.id = player_position.player_id;

ハンドボールの場合:

SELECT players.name, players.surname, positions.name 
FROM players, sports, positions, player_position 
WHERE sports.id = 2 AND positions.sport_id = sports.id AND payer_position.position_id = positions.id AND players.id = player_position.player_id;
于 2012-05-20T14:45:10.757 に答える