我正在挖掘有关mysql中的数据透视表的一些信息,幸运的是我找到了一些东西,我在sqlfiddle和wamp控制台中测试它:
两者都有不同的数据,因为我在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));
}
答案 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文件中。