sql >> Database teknologi >  >> RDS >> Mysql

Hvordan viser jeg mysql-tabelrækken som kolonne

Det, du ønsker at gøre, er kendt som at "pivotere" dine data og er noget, som nogle andre RDBMS har indbygget understøttelse for, men det gør MySQL ikke (ved design, da udviklerne føler, at sådanne manipulationer hører hjemme i præsentationslaget).

Du har dog et par muligheder:

  1. Konstruer en ret forfærdelig MySQL-forespørgsel for at udføre pivoteringsoperationen manuelt:

    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
    

    Hvis du vælger at gå ned ad denne vej, kan du gøre dit liv lidt lettere ved at generere denne forespørgsel automatisk ved at bruge enten en looping-konstruktion i PHP eller en forberedt sætning i MySQL.

    Her er en måde, du kan gøre det på i PHP:

    1. Få en liste over kurser:

      $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 resultaterne og konstruer ovenstående 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. Udfør SQL'en, og indfør rækken af ​​kurser som parametre:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Udskriv resultaterne:

      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. Gør ovenstående som en engangshandling, så strukturen af ​​din MySQL-database ændres, så den i højere grad afspejler dette ønskede layout (let, når først tabellen er konverteret, men kan påvirke andre anvendelser af databasen):

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

    Alternativt kan du oprette en VIEW som er en slags "virtuel tabel" struktureret på denne måde baseret på den underliggende tabel.

  3. Drej dataene manuelt i PHP (relativt kedeligt).




  1. Fejlværdien findes ikke - postgresql INSERT INTO-problem

  2. Brug af row_to_json() med indlejrede joinforbindelser

  3. hvordan man opdaterer swap-værdier for to rækker med en enkelt forespørgsel

  4. SQL-tutorial:One Stop-løsning til at lære SQL