2016-09-30 2 views
2

두 개의 테이블이 있습니다. 하나의 표에는 이름 및 순위와 같은 플레이어 정보가 포함됩니다. 다른 테이블에는 게임 대체 정보가 들어 있습니다.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 개의 기간과 마지막에 요약 열이 있습니다. 이 데이터를 평평하게하는 쉬운 방법이 있어야합니다!

<?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

당신이 거의 다라고 생각을 연결하는 join를 사용할 수 있습니다. $ 기간은 어디에 정의되어 있습니까? – 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

관련 문제