sql >> Databasteknik >  >> RDS >> Mysql

Hur visar jag mysql-tabellraden som kolumn

Det du vill göra är känt som att "pivotera" din data och är något som vissa andra RDBMS har inbyggt stöd för, men MySQL har inte det (genom designen, eftersom utvecklarna anser att sådana manipulationer hör hemma i presentationslagret).

Du har dock några alternativ:

  1. Konstruera en ganska hemsk MySQL-fråga för att utföra svängningsoperationen manuellt:

    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
    

    Om du väljer att gå på den här vägen kan du göra ditt liv något enklare genom att generera den här frågan automatiskt, antingen genom att använda en looping-konstruktion i PHP eller en förberedd sats i MySQL.

    Här är ett sätt att göra det i PHP:

    1. Få en lista över 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. Slinga över resultaten och konstruera ovanstå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. Kör SQL, skicka in arrayen av kurser som parametrar:

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

      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 ovanstående som en engångsåtgärd så att strukturen på din MySQL-databas ändras för att bättre återspegla den önskade layouten (lätt när tabellen väl har konverterats, men kan påverka andra användningar av databasen):

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

    Alternativt kan du skapa en VIEW som är en sorts "virtuell tabell" strukturerad på detta sätt baserat på den underliggande tabellen.

  3. Pivotera data manuellt i PHP (relativt tråkigt).




  1. Ställa in ODBC-anslutningsattribut utan att behöva skriva kod

  2. MySQL-syntax för att infoga en ny rad i mittraderna?

  3. Importera enstaka databas från --all-databases dump

  4. Implementera en Multi-Datacenter Setup för PostgreSQL - Del två