Mysql Pivot表没有显示结果

时间:2016-01-31 18:59:03

标签: php mysql

我正在挖掘有关mysql中的数据透视表的一些信息,幸运的是我找到了一些东西,我在sqlfiddle和wamp控制台中测试它: enter image description here

两者都有不同的数据,因为我在wamp控制台中使用的是我的实际数据库。

不幸的是,当我在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));
    }

1 个答案:

答案 0 :(得分: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();')

这种方法的主要优点是使用MySQL工作台或PHPStorm数据库工具等SQL工具可以非常轻松地管理它,此外PHP和SQL代码都变得更容易阅读和支持。您还可以将程序的源代码存储在git。下的.sql文件中。