1

私のコードは現在これです:

if (isset($_POST['viewstudentdrop'])) {
    $query = "SELECT students.*, lessons.lessonname 
            FROM lessons INNER JOIN 
            (assignments INNER JOIN students 
            ON assignments.studentid = students.id) 
            ON lessons.lessonid = assignments.lesson
            WHERE (((students.id)=".$_POST['viewstudentdrop']."))";
    $results = $pdodl->query($query);
    while ($row = $results->fetch()) {
            echo "<p>Lesson: ". $row['lessonname'] . "</p>";
    }
   // View Completed Lessons and Times
    $query = "SELECT * 
            FROM studentresponse 
            WHERE studentid = ".$_POST['viewstudentdrop']." 
            ORDER BY lessonsession";
    $results = $pdodl->query($query);
    echo '<table> ';
    while ($row = $results->fetch()) {
    echo '<tr> <td> ' . $row['actiontime'] .'</td>' .
                     ' <td> ' . $row['page'] .'</td>' .
                     ' <td> ' . $row['response'] . '</td>'.
                     ' <td> '. $row['lessonsession'] . '<td> </tr>';
    }
    echo  '</table>';  
}

次のような出力が得られます。

19:40:44     sda02   C   11360611641    
19:40:46     sda03   D   11360611641    
19:40:50     sda04   3   11360611641    
19:40:53     sda05   A   11360611641    
19:41:22     sda02   B   11360611678    
19:41:24     sda03   C   11360611678    
19:41:31     sda04   5   11360611678    
19:41:34     sda05   B   11360611678    
20:00:39     sda02   B   11360612836    
20:00:41     sda03   C   11360612836    
20:00:44     sda04   3   11360612836    
20:00:47     sda05   B   11360612836    

上記のようにフォーマットされたデータをデータベースから直接テーブルに出力できますが、次のようなテーブルとして出力したいと思います(レッスンセッションによって壊れています):

sda02     sda03     sda04     sda05
19:40:44  19:40:46  19:40:50  19:40:53
C         D         3         A

sda02     sda03     sda04     sda05
19:41:22  19:41:24  19:41:31  19:41:34
B         C         5         B

.... 次のレッスンセッション グループについても同様です。

以前は混乱していたかもしれません。これが私の問題を明確にするのに役立つことを願っています。ありがとう!

4

2 に答える 2

0

これはSQLでこれを行うための本当に醜い方法です。

この回答は、ユーザー定義変数を実装して各行の行番号を生成し、これを使用してデータを列にピボット解除します。最後に、CASE式を含む集計関数を使用して、データをローテーションして列に戻します。

select col,
  lessonsession,
  max(case when rn = 1 then value end) Col1,
  max(case when rn = 2 then value end) Col2,
  max(case when rn = 3 then value end) Col3,
  max(case when rn = 4 then value end) Col4
from
(
  select 'actiontime' col, actiontime value, lessonsession, rn
  from 
  (
    select actiontime,
      page, 
      response, 
      lessonsession,
      @row:=case when @prev=lessonsession then @row else 0 end +1 rn,
      @prev:=lessonsession
    from yourtable
    cross join (select @row:=0, @prev:=null) r
    order by lessonsession
  ) s
  union all
  select 'page' col, page value, lessonsession, rn
  from
  (
    select actiontime,
      page, 
      response, 
      lessonsession,
      @row:=case when @prev=lessonsession then @row else 0 end +1 rn,
      @prev:=lessonsession
    from yourtable
    cross join (select @row:=0, @prev:=null) r
    order by lessonsession
  ) s
  union all
  select 'response' col, response value, lessonsession, rn
  from 
  (
    select actiontime,
      page, 
      response, 
      lessonsession,
      @row:=case when @prev=lessonsession then @row else 0 end +1 rn,
      @prev:=lessonsession
    from yourtable
    cross join (select @row:=0, @prev:=null) r
    order by lessonsession
  ) s
) src
group by col, lessonsession
order by lessonsession, col

SQL FiddlewithDemoを参照してください。

これにより、次の結果が得られます。

|        COL | LESSONSESSION |     COL1 |     COL2 |     COL3 |     COL4 |
--------------------------------------------------------------------------
| actiontime |   11360611641 | 19:40:44 | 19:40:46 | 19:40:50 | 19:40:53 |
|       page |   11360611641 |    sda02 |    sda03 |    sda04 |    sda05 |
|   response |   11360611641 |        C |        D |        3 |        A |
| actiontime |   11360611678 | 19:41:34 | 19:41:31 | 19:41:24 | 19:41:22 |
|       page |   11360611678 |    sda05 |    sda04 |    sda03 |    sda02 |
|   response |   11360611678 |        B |        5 |        C |        B |
| actiontime |   11360612836 | 20:00:39 | 20:00:41 | 20:00:44 | 20:00:47 |
|       page |   11360612836 |    sda02 |    sda03 |    sda04 |    sda05 |
|   response |   11360612836 |        B |        C |        3 |        B |

これを簡単にクリーンアップするためにできることの1つは、行番号が適用されたら、レコードに一時テーブルを使用することです。以下を一時テーブルに挿入すると、それほど繰り返さずにコードが短くなります。

select actiontime,
  page, 
  response, 
  lessonsession,
  @row:=case when @prev=lessonsession then @row else 0 end +1 rn,
  @prev:=lessonsession
from yourtable
cross join (select @row:=0, @prev:=null) r
order by lessonsession
于 2013-02-11T23:53:32.133 に答える
0

わかりました...配列を使用してページ上のデータを再編成するという当初の考えをなんとか解決しました。

コードは次のとおりです(2番目のクエリから取得):

    $query = "SELECT * 
            FROM studentresponse 
            WHERE studentid = ".$_POST['viewstudentdrop']." 
            ORDER BY lessonsession";
    $results = $pdodl->query($query);
    while ($row = $results->fetch()) { 
        $iteration[] = array ($row['page'], $row['actiontime'], $row['response'], $row['lessonsession']);
        }
    //Rewrite the data using the array into the format I want
    $x=0; $y=0;
    echo '<table>';
    while (isset($iteration[$x][$y]))  {
        echo '<tr>';        
        while (isset($iteration[$x][$y])) {
            echo '<td>' . $iteration[$x][$y] . '</td>';
            $x++;
        }
        echo '</tr>';
        $x = 0;
        $y++;
}
    echo '</table>';

これにより、次のようになります。 ここに画像の説明を入力してください これで、「レッスンセッション」の変更ごとにテーブルを壊すだけです。

(私は今、本当にプログラマーのように感じています-セミコロンで文を終了したいです。)

于 2013-02-12T01:51:53.327 に答える