3

私はバスケットボールリーグのテーブル、チームのテーブル、そして次のような選手のテーブルを持っています:

LEAGUES
ID   |   NAME    |
------------------
1    |   NBA     |
2    |   ABA     |

TEAMS:
ID   |   NAME    |  LEAGUE_ID
------------------------------
20   |   BULLS   |    1
21   |   KNICKS  |    2

PLAYERS:
ID   |   TEAM_ID  |  FIRST_NAME | LAST_NAME | 
---------------------------------------------
1    |      21    |   John      |  Starks   |    
2    |      21    |   Patrick   |  Ewing    |    

リーグIDを指定して、そのリーグのすべてのチームからすべてのプレーヤーの名前とチームIDを取得したいので、次のようにします。

SELECT t.id AS team_id, p.id AS player_id, p.first_name, p.last_name
FROM teams AS t
JOIN players AS p ON p.team_id = t.id
WHERE t.league_id =  1

これは次を返します:

[0] => stdClass Object
    (
        [team_id] => 21
        [player_id] => 1
        [first_name] => John
        [last_name] => Starks
    )

[1] => stdClass Object
    (
        [team_id] => 21
        [player_id] => 2
        [first_name] => Patrick
        [last_name] => Ewing
    )

+ around 500 more objects...

この結果を使用して、各チームのプレーヤーのリストを含む各チームのドロップダウンメニューにデータを入力するので、結果をチームIDでグループ化したいので、これらのドロップダウンを作成するループは、代わりに各チームIDを循環するだけで済みます。毎回500人以上のプレイヤー全員。

しかし、次のようにGROUP BYを使用すると、次のようになります。

SELECT t.id AS team_id, p.id AS player_id, p.first_name, p.last_name
FROM teams AS t
JOIN players AS p ON p.team_id = t.id
WHERE t.league_id =  1
GROUP BY t.id

このように各チームから1人のプレーヤーのみが返され、同じ列名が使用されているため、同じチームの他のすべてのプレーヤーがオーバーライドされます。

[0] => stdClass Object
    (
        [team_id] => 21
        [player_id] => 2
        [first_name] => Patrick
        [last_name] => Ewing
    )
[1] => stdClass Object
    (
        [team_id] => 22
        [player_id] => 31
        [first_name] => Shawn
        [last_name] => Kemp
    )
etc...

私はこのようなものを返したいです:

[0] => stdClass Object
    (
        [team_id] => 2

        [player_id1] => 1
        [first_name1] => John
        [last_name1] => Starks
        [player_id2] => 2
        [first_name2] => Patrick
        [last_name2] => Ewing

        +10 more players from this team...
    )

    +25 more teams...

どういうわけか可能ですか?

4

2 に答える 2

4

その結果をデータセットの形式で表すことができないため、これを SQL で行うことはできません。複雑なオブジェクトを返したい。あなたができることは、コードでこれを処理し、team_id でソートされたデータ セットを返すことで自分自身を助けることです。team_id が変更されるたびに、コードで新しいオブジェクトを作成し、新しいプレーヤーのリストを入力します。

次のようになります (構文が正しくない可能性があります)。

返された結果セット:

team_id|player_id|first|last
1|1|f1|l1
1|2|f2|l2
1|3|f3|l3
2|5|f5|l5
2|6|f6|l6

そして、これがコードで返されたとき

$lastTeamId=0;
$output=array();
foreach($results as $row){
  if($lastTeamId != $row["team_id"]){
    $lastTeamId = $row["team_id"];
    $output[$lastTeamId] = array();
  }

  $newPlayer = null;
  $newPlayer->id = $row["player_id"];
  $newPlayer->first = $row["first"];
  $newPlayer->last = $row["last"];
  $output[$lastTeamId][] = $newPlayer;
}
于 2012-10-19T14:45:57.330 に答える
0

MySQL では、GROUP BY team_id を実行してから SELECT GROUP_CONCAT(player detail ...) を実行できます。しかし、これには制限があり、典型的なリレーショナル アプローチではありません。

于 2012-10-19T14:50:51.200 に答える