您的问题是您的查询无效。您错过了将包含您在列上创建的条件聚合的字符串(您使用带有 GROUP_CONCAT 的第一个 SELECT 生成的字符串)与包含表中实际 SELECT 的字符串连接的基本部分。
相反,你写了
SELECT @sql;
它将一个字符串返回给客户端。
但在那之后
prepare stmt FROM @sql;
由于上述原因而失败。
现在对于您之前的问题,您已经得到了一个看起来像正确代码的答案。为了简化从 php 调用此代码,我强烈建议将其包装到存储过程中
DELIMITER $$
CREATE PROCEDURE sp_pivotscores()
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when gameid = ''',
gameid,
''' then score else 0 end) AS ''',
gameid, ''''
)
) INTO @sql
FROM scores;
SET @sql = CONCAT('SELECT coalesce(playerid, ''Column Total'') as playerid, ', @sql, ', sum(score) as row_total
FROM scores
GROUP BY playerid WITH ROLLUP');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
然后你的 php 代码可能看起来像
try {
$db = new PDO('mysql:host=localhost;dbname=your_db_name;charset=UTF8', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$query = $db->prepare("CALL sp_pivotscores()");
$query->execute();
$result = $query->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "Exeption: " .$e->getMessage(); //TODO better error handling
$result = false;
}
$query = null;
$db = null;
var_dump($result);