आप जो करना चाहते हैं उसे आपके डेटा को "पिवोटिंग" के रूप में जाना जाता है और कुछ ऐसा है जिसके लिए कुछ अन्य आरडीबीएमएस के पास मूल समर्थन है, लेकिन MySQL (डिजाइन द्वारा, जैसा कि डेवलपर्स को लगता है कि इस तरह के जोड़तोड़ प्रस्तुति परत में हैं) नहीं है।
हालांकि, आपके पास कुछ विकल्प हैं:
-
मैन्युअल रूप से पिवोटिंग ऑपरेशन करने के लिए एक भयानक 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 में ऐसा कर सकते हैं:
-
पाठ्यक्रमों की सूची प्राप्त करें:
$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);
-
उपरोक्त 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 = ?";
-
मापदंडों के रूप में पाठ्यक्रमों की सरणी में गुजरते हुए SQL को निष्पादित करें:
$qry = $dbh->prepare($sql); $params = $courses; array_push($params, $level, $semester); $qry->execute($params);
-
परिणाम आउटपुट करें:
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>";
-
-
उपरोक्त को एकबारगी ऑपरेशन के रूप में करें ताकि आपके MySQL डेटाबेस की संरचना को इस वांछित लेआउट को और अधिक बारीकी से प्रतिबिंबित किया जा सके (तालिका परिवर्तित होने के बाद आसान है, लेकिन डेटाबेस के अन्य उपयोगों को प्रभावित कर सकता है):
CREATE TABLE StudentGrades (PRIMARY KEY('Matriculation')) SELECT student_id AS Matriculation, MAT111, MAT112, gp AS GP -- etc. as above
वैकल्पिक रूप से, आप एक
VIEW
जो एक प्रकार की "वर्चुअल टेबल" है जिसे अंतर्निहित तालिका के आधार पर इस तरह संरचित किया जाता है। -
डेटा को मैन्युअल रूप से PHP में पिवट करें (अपेक्षाकृत थकाऊ)।