sql >> Database >  >> RDS >> Mysql

Hoe toon ik mysql-tabelrij als kolom?

Wat u wilt doen, staat bekend als het "draaien" van uw gegevens en is iets waarvoor sommige andere RDBMS native ondersteuning hebben, maar MySQL niet (door ontwerp, aangezien de ontwikkelaars vinden dat dergelijke manipulaties in de presentatielaag thuishoren).

Je hebt echter een paar opties:

  1. Maak een nogal vreselijke MySQL-query om de draaibewerking handmatig uit te voeren:

    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
    

    Als u ervoor kiest om dit pad te volgen, kunt u uw leven iets gemakkelijker maken door deze query automatisch te genereren, met behulp van een looping-constructie in PHP of een voorbereide instructie in MySQL.

    Hier is een manier om dat in PHP te doen:

    1. Een lijst met cursussen verkrijgen:

      $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. Loop over de resultaten en maak de bovenstaande SQL:

      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. Voer de SQL uit en geef de reeks cursussen door als parameters:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Voer de resultaten uit:

      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. Doe het bovenstaande als een eenmalige handeling zodat de structuur van uw MySQL-database wordt gewijzigd om deze gewenste lay-out beter weer te geven (eenvoudig als de tabel eenmaal is geconverteerd, maar kan van invloed zijn op ander gebruik van de database):

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

    U kunt ook een VIEW wat een soort "virtuele tabel" is die op deze manier is gestructureerd op basis van de onderliggende tabel.

  3. Draai de gegevens handmatig in PHP (relatief vervelend).




  1. Databaseschema voor ACL

  2. Hoe definieer je een unieke beperking op een kolom van de MySQL-tabel in Ruby on Rails 3?

  3. Een tabel maken in SQL Server

  4. Gegevens uit twee tabellen selecteren met een enkele query