2016-01-31 37 views
0

我挖一些信息是關於數據透視表中的MySQL,幸運的是我發現的東西,我測試它在sqlfiddle,並在WAMP控制檯: enter image description hereMysql的數據透視表沒有結果顯示

都有怎麼把一個不同的數據我在wamp console中使用的是我的實際數據庫。

不幸的是,當我在php測試它有不同於sqlfiddle和WAMP控制檯沒有結果..

這裏是我的腳本:

$link = mysqli_connect("localhost", "root", "", "dbmobile_class_record"); 

    $sql_pivot = "SET @sql = NULL;"; 
    $sql_pivot .= "SELECT 
        GROUP_CONCAT(
        DISTINCT CONCAT(
         'MAX(IF(criteria = ''', 
         criteria, 
         ''', score, NULL)) AS ', 
         CONCAT(',criteria,') 
        ) 
       ) INTO @sql FROM tb_student_record;"; 
    $sql_pivot .= "SET @sql = CONCAT(
        'SELECT stud_name, ', 
        @sql, 
        ' FROM tb_student_record GROUP BY stud_name' 
       );"; 
    $sql_pivot .= "PREPARE stmt FROM @sql;"; 
    $sql_pivot .= "EXECUTE stmt;"; 
    $sql_pivot .= "DEALLOCATE PREPARE stmt;"; 

    if (mysqli_multi_query($link, $sql_pivot)){ 
     do { 
      if ($result = mysqli_store_result($link)){ 
       while ($row = mysqli_fetch_array($result)){ 
        echo $row['criteria']; 
        echo $row['stud_name']; 
        echo $row['score']; 
       } 
       mysqli_free_result($result); 
      } 
     } while (mysqli_next_result($link)); 
    } 

回答

0

你應該更好的封裝SQL批處理到存儲過程,然後單CALL語句運行:

DELIMITER ; 
DROP PROCEDURE IF EXISTS sp_pivot; 
DELIMITER $ 
CREATE PROCEDURE sp_pivot() 
SQL SECURITY INVOKER 
BEGIN 
    SET @sql = NULL; 

    SELECT 
     GROUP_CONCAT(
      DISTINCT CONCAT(
       'MAX(IF(criteria = ''', 
       criteria, 
       ''', score, NULL)) AS ', 
       CONCAT(',criteria,') 
      ) 
     ) INTO @sql FROM tb_student_record; 

    SET @sql = CONCAT(
     'SELECT stud_name, ', 
     @sql, 
     ' FROM tb_student_record GROUP BY stud_name' 
    ); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END $ 
DELIMITER ; 

從PHP:

mysqli_query($link, 'CALL sp_pivot();') 

這種方法的主要優點是,使用SQL工具(如MySQL工作臺或PHPStorm數據庫工具)可以非常容易地管理此問題,此外PHP和SQL代碼都變得更易於閱讀和支持。你也可以在git下的.sql文件中存儲過程的源代碼。