2016-09-30 4 views
2

2つのテーブルがあります。 1つのテーブルには、名前や順位などのプレーヤ情報が含まれています。もう1つのテーブルにはゲームの置換情報が含まれています。MySQLの結果を平坦化する方法

出力は次のようになります。

Rank| Player Name | Period 1 position | Period 2 Position| Period 3 Position | 

プレーヤー表サンプル

|ID| Name | Rank | 
|1 | Fred | 10  | 
|2 | Dan | 12  | 
|3 | Mike | 15  | 

位置テーブルサンプルの下

|ID| Game_ID | Player_ID | Period | Position  | 
|1 | 12  | 1   | 1  | Striker Right| 
|2 | 12  | 1   | 2  | Mid Center | 
|3 | 12  | 2   | 1  | Striker Left | 

は、MySQL

からそれを取得するためのコードです

返されたデータセットをさまざまな方法で変換しようとしました。

$players_sql = "SELECT position.id as position_id, 
player.rank, 
player.first_name, 
position.period, 
position.position 
FROM player 
INNER JOIN position 
on player.id = position.player_id 
ORDER BY player.rank, position.period;"; 

if ($result = $mysqli->query($players_sql)) { 
// printf("Select returned %d rows.\n", mysqli_num_rows($result)); 
/* fetch associative array */ 
while ($row = $result->fetch_assoc()) { 
    $subs[$row["position_id"]] = [ 
     "rank" => $row["rank"], 
     "first_name" => $row["first_name"], 
     "period" => $row["period"], 
     "position" => $row["position"] 
    ]; 
} 
mysqli_free_result($result); 
} 

// collapse players This works 
foreach ($subs as $sub) { 
    $players_by_rank[$sub["rank"]] = $sub["first_name"]; 
} 

その後、データはユーザーが送信できる形式で表示されます。以下のコードは上記のコードと一致しません。以下のコードでは、データベースから取得したものではなく、あらかじめデータが埋め込まれている静的に定義された配列を使用していました。これは、出力が必要なものを視覚化する方法を提供します。下のコード例では、合計4つの期間が4つの列になり、最後の列が最後に表示されます。このデータを簡単に平坦化する方法が必要です。

<?php 
for ($sub = 1; $sub < $sub_info . length; $sub++) { 
    ?> 
    <tr> 
     <td><?php echo $sub_info[sub] ?></td> 
     <td><input type = "text" 
        name = "p<?php echo $player; ?>" 
        value = "<?php echo $names[$player - 1]; ?>" 
        id = "p<?php echo $player; ?>" ></td> 
      <?php 
      for ($period = 1; $period < $periods + 1; $period++) { 
       ?> 
      <td> 
       <div class="form-group"> 
        <select onchange="calTotals(<?php echo $player . ',' . $period; ?>)" 
          id="<?php echo "p{$player}p{$period}"; ?>" 
          name="<?php echo "p{$player}p{$period}"; ?>"> 
           <?php 
           $output = ""; 
           for ($i = 0; $i < $players_on_field + 1; $i++) { 
            $output = "<option"; 
            if ($i == 0) { 
             $output .= ' selected'; 
            } 
            $output .= ">$i</option>"; 
            echo $output; 
           } 
           ?> 
        </select> 
       </div> 
      </td> 
     <?php } ?> <!-- Periods --> 
     <td><!-- total periods in game using JavaScript --> 
      <input type="text" 
        name="<?php echo "periods{$player}"; ?>" 
        id="<?php echo "periods{$player}"; ?>"> 
     </td> 
    </tr> 
<?php } ?> <!-- players --> 
+0

(ピリオド1つ)、テーブルを接続するためにjoinを使用してプレイヤーのテーブルの1つのインスタンス、および位置の3することができます私はあなたがほとんどそこにいると思います。 $期間はどこに定義されていますか? – Strawberry

答えて

2

あなたは

SELECT pl.rank, pl.name, 
    po1.position as period_1_position, 
    po2.position as period_2_position, 
    po3.position as period_3_position from 
    player as pl 
    inner join position as po1 on pl.id = po1.player_id and po1.period=1 
    inner join position as po2 on pl.id = po2.player_id and po2.period=2 
    inner join position as po3 on pl.id = po3.player_id and po3.period=3 
+0

これは質問に答えます!ありがとうございました!後で私はどのくらいの期間があるのか​​分からないでしょう、期間範囲は、おそらく1から8になるでしょう。それは元の質問の一部ではありませんでした。直接の回答ありがとうございます! – geeves

関連する問題