我正在尝试从一行中创建一个数据透视列,但在 php 方面遇到了一些挑战。当我在 mysql consol 中运行查询时,它运行良好并返回所需的值。但是当我在 php 中运行它时,它返回 mysql 语法错误。我没能弄清楚真正的问题是什么。 查询分别针对普通 mysql 和 php
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when Ref_Month = ''',
Ref_Month,
''' then Total_Income end) AS ''',
Ref_Month, ''''
)
) INTO @sql
FROM mytable;
SET @sql = CONCAT('SELECT Tone_Name, ', @sql, ' FROM mytable WHERE Ref_Year in (2015) GROUP BY Tone_Name limit 10');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
对于 PHP/codeigniter
$query = $this->db->query("SET @sql = NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT('sum(case when Ref_Month = ''', Ref_Month, ''' then Total_Income end) AS ''', Ref_Month, '''')) INTO @sql FROM mytable; SET @sql = CONCAT('SELECT Tone_Name, ', @sql, ' FROM mytable WHERE Ref_Year in (2015) GROUP BY Tone_Name limit 10'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;");
收到的错误消息是:
A Database Error Occurred Error Number: 1064 Erreur de syntaxe près de 'SELECT GROUP_CONCAT(DISTINCT CONCAT('sum(case when Ref_Month = ''', Ref_Month, '' à la ligne 1
请有人帮助我。我还想知道如何在前端的 HTML/PHP 中显示此类列和行。
谢谢。
最佳答案
您正在单个 query() 方法调用中运行多个查询。标准 MySQL 数据库驱动程序有单独的方法在一次调用中执行多个 sql 查询,但 CI 使用标准调用,每次调用只允许执行一个 sql 命令。
在单独的 CI 查询调用中执行每个 sql 语句:
$this->db->query("SET @sql = NULL");
...
$this->db->query("DEALLOCATE PREPARE stmt");
尽管您可以自己在 php 中完成所有字符串连接,因此您根本不需要使用 MySQL 的准备语句。
关于php - 在 php 中从一行创建动态数据透视列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38100802/