2012-04-28 5 views
2

私はresultgpの2つのテーブルを持っています。私はこのような何かを持っているresultテーブルで列としてmysqlテーブル行を表示するには

|id||student_id ||course_code||grade||session ||level||semester| 
|1 ||TR/2213234561||MAT111  ||A ||2009/2010||100 ||first | 
|2 ||TR/2213234561||MAT112  ||B ||2009/2010||100 ||first | 
|3 ||TR/2213234561||MAT113  ||C ||2009/2010||100 ||first | 
|4 ||TR/2213234567||MAT111  ||D ||2009/2010||200 ||first | 
|5 ||TR/2213234567||MAT112  ||C ||2009/2010||200 ||first | 
|6 ||TR/2213234567||MAT113  ||C ||2009/2010||200 ||first | 

その後、私が欲しいものgpテーブル

|id||student_id ||session ||level||semester||gp | 
|1 ||TR/2213234561||2009/2010||100 ||first ||4.2| 
|2 ||TR/2213234567||2009/2010||100 ||first ||3.5| 
|3 ||TR/2213234561||2010/2011||200 ||first ||4.2| 
|4 ||TR/2213234567||2010/2011||200 ||first ||3.5| 

はこのようなものです:

|Matriculation||MAT111||MAT112||MAT113||MAT114||GP | 
|TR/2213234561||A  ||B  ||D  ||C  ||4.2| 
|TR/2213234567||C  ||D  ||E  ||F  ||3.5| 

コースコードではありません定数 - それは学生によって登録されたコースに依存する

私はこれを行っている:

<?php 
$rst1 = mysql_query("select distinct course_code from result ", $conn); 
echo "<table callspacing='4'>"; 
echo "<tr>"; 
echo "<td> Matriculation Number </td>"; 

$c_code = array(); 
while ($row = mysql_fetch_array($rst1)) 
{ 
    $c_code[] = $row['course_code']; 
} 

foreach($c_code as $c_code) 
{ 
    echo "<td>" .$c_code. "</td>"; 
} 

$sql ="SELECT result.student_id, 
     MAX(CASE WHEN course_code = ' $c_code' THEN grade END) $c_code, 
     gp.CTC 
     FROM result 
     JOIN gp 
     ON gp.student_id = result.student_id 
     GROUP 
     BY student_id"; 

echo "<td> GP</td>";       
$rst = mysql_query("$sql",$conn) or die(mysql_error()); 

while ($row = mysql_fetch_array($rst)) 
{ 
    echo "</tr>"; 
    echo "<tr>"; 
    echo "<td>" .$row['student_id']. "</td>"; 
    echo "<td>" .$row[$c_code]. "</td>"; 
} 

echo "<td>" .$row[$c_code]. "</td>"; 
echo "<td>" .$row['CTC']. "</td>"; 

echo"</tr>"; 
echo "</table>"; 
?> 

最初の問合せは、コースは定数ではないので、コースコードを取得することでした。そのコードと

、私はこのようなものだ:

|Matriculation||MAT111||MAT112||MAT113||MAT114||GP| 
|TR/2213234561| 
|TR/2213234567| 

をしかし、私は、任意の提案や方向が高く評価されます

|Matriculation||MAT111||MAT112||MAT113||MAT114||GP | 
|TR/2213234561||A  ||B  ||D  ||C  ||4.2| 
|TR/2213234567||C  ||D  ||E  ||F  ||3.5| 

を望んでいました。

答えて

2

あなたのやりたいことはあなたのデータを "ピボットする"と呼ばれ、他のいくつかのRDBMSがネイティブサポートを持っているものですが、MySQLは(設計上、開発者がそのような操作がプレゼンテーション層に属すると感じるので) 。

しかし、あなたはいくつかのオプションがあります。

  1. は、手動での旋回操作を実行するために、むしろ恐ろしいMySQLのクエリを作成:

    SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP 
        FROM gp 
        NATURAL JOIN (
        SELECT student_id, grade AS MAT111 
        FROM result 
        WHERE course_code = 'MAT111' 
    ) AS tMAT111 
        NATURAL JOIN (
        SELECT student_id, grade AS MAT112 
        FROM result 
        WHERE course_code = 'MAT112' 
    ) AS tMAT112 
        -- etc. 
    WHERE level = @level AND semester = @semester 
    

    あなたはこの道を行くことを選択した場合は、することができますPHPのループ構造またはMySQLのプリペアドステートメントのいずれかを使用して、自動的にこのクエリを生成することにより、あなたの人生を少し楽にしてください。ここで

    はあなたがPHPでそれを行う可能性が一つの方法である:

    1. コースのリストの取得:

      :上記のSQLを構築し、その結果の上に

      $dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', $user, $password); 
      $qry = $dbh->query("SELECT DISTINCT course_code FROM result [WHERE ...]"); 
      $courses = $qry->fetchAll(PDO::FETCH_COLUMN, 0); 
      
    2. ループを

      mb_regex_encoding($charset); 
      
      $columns = mb_ereg_replace('`', '``', $courses); 
      $sql = " 
      SELECT student_id AS Matriculation, `".implode("`,`", $columns)."`, gp AS GP 
          FROM gp"; 
      
      foreach ($columns as $column) $sql .= " 
          NATURAL JOIN (
          SELECT student_id, grade AS `$column` 
          FROM result 
          WHERE course_code = ? 
      ) AS `t$column`"; 
      
      $sql .= " 
      WHERE level = ? AND semester = ?"; 
      
    3. パラメータを指定してコースの配列を渡してSQLを実行します。

      $qry = $dbh->prepare($sql); 
      
      $params = $courses; 
      array_push($params, $level, $semester); 
      $qry->execute($params); 
      
    4. 出力結果:MySQLデータベースの構造がより密接に、この目的のレイアウトを反映するように変更されるように

      echo "<table>"; 
      
      echo "<tr>"; 
      for ($i = 0; $i < $qry->columnCount(); $i++) { 
          $meta = $qry->getcolumnMeta($i); 
          echo "<th scope='col'>" . htmlentities($meta['name']) . "</th>"; 
      } 
      echo "</tr>"; 
      
      while ($row = $qry->fetch(PDO::FETCH_NUM)) { 
          echo "<tr>"; 
          foreach ($row as $field) echo "<td>" . htmlentities($field) . "</td>" 
          echo "</tr>"; 
      } 
      
      echo "</table>"; 
      
  2. は一回限りの操作として上記を実行してください(簡単テーブル)が変換されるが、データベースの他の用途に影響を与えるかもしれない一度:

    CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) 
    SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP 
        -- etc. as above 
    

    あるいはVIEWを作成することができます。VIEWは、基礎となるテーブルに基づいてこのように構成された一種の「仮想テーブル」です。

  3. PHPで手動でデータをピボットする(比較的面倒です)。

関連する問題