sql >> Databáze >  >> RDS >> Mysql

Jak zobrazím řádek tabulky mysql jako sloupec

To, co si přejete udělat, je známé jako „pivotování“ vašich dat a je to něco, pro co mají některé jiné RDBMS nativní podporu, ale MySQL ne (záměrně, protože vývojáři se domnívají, že takové manipulace patří do prezentační vrstvy).

Máte však několik možností:

  1. Sestavte dosti příšerný dotaz MySQL pro ruční provedení operace pivotování:

    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
    

    Pokud se rozhodnete jít touto cestou, můžete si trochu usnadnit život automatickým generováním tohoto dotazu, buď pomocí smyčkové konstrukce v PHP nebo připraveného příkazu v MySQL.

    Zde je jeden způsob, jak to můžete udělat v PHP:

    1. Získejte seznam kurzů:

      $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. Opakujte výsledky a vytvořte výše uvedený 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. Spusťte SQL a předejte pole kurzů jako parametry:

      $qry = $dbh->prepare($sql);
      
      $params = $courses;
      array_push($params, $level, $semester);
      $qry->execute($params);
      
    4. Výstup výsledků:

      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. Výše uvedené proveďte jako jednorázovou operaci, aby se struktura vaší databáze MySQL změnila tak, aby přesněji odrážela toto požadované rozložení (snadné, jakmile je tabulka převedena, ale může mít vliv na další použití databáze):

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

    Případně můžete vytvořit VIEW což je jakási „virtuální tabulka“ strukturovaná tímto způsobem na základě podkladové tabulky.

  3. Natočte data ručně v PHP (poměrně zdlouhavé).




  1. Jak zakódujete apostrof, aby bylo možné jej vyhledávat v mysql?

  2. SQL Server RAISERROR prohlášení s jednoduchými příklady

  3. Jak získat přístup k online databázi mysql v systému Android?

  4. Vytvoření vysoce dostupné databáze pro Moodle pomocí PostgreSQL