2015-09-11 60 views
0

我有Mysql prepare语句在命令行中工作。如何让它与PHP PDO准备语句一起工作?用php执行mysql pivotable语句PDO

set @sql = null; 
SET group_concat_max_len=15000; 

select group_concat(distinct concat('sum(if(date=''',date_format(date,'%Y-%m-%d'),''',total,null)) as ', date_format(date,'dd%Y%m%d'))) into @sql from sales where date_format(date,'%m%y')='0615'; 

set @sql = concat('select ',@sql,' from sales'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

回答

0

您可以使用PHP而不是SQL来进行组连接。

$pdo->query("SET group_concat_max_len = 15000"); 
$stmt1 = $pdo->prepare("select distinct concat('sum(if(date=''',date_format(date,'%Y-%m-%d'),''',total,null)) as ', date_format(date,'dd%Y%m%d')) as col from sales where date_format(date,'%m%y')= :mmyy"; 
$stmt1->execute(":mmyy" => '0615'); 
$cols = $stmt1->fetchAll(PDO::FETCH_COLUMN, 0); 
$cols_string = implode(',' $cols); 
$sql = "SELECT $col_string FROM sales"; 
$stmt2 = $pdo->prepare($sql); 
$stmt2->execute(); 
+0

因为我不想使用循环,所以这是最接近的答案。但是我真的很想在一个执行语句中做,在任何情况下都有可能吗? – praHoc

+0

您粘贴的SQL代码不是单个语句,它由6个独立的语句组成。 – Naktibalda

+0

@praHoc由于PDO不允许您在一次调用中执行多个查询,因此您必须使用这些语句进行6次查询。那有什么意义呢?你可以写一个MySQL存储过程来完成它,然后调用这个过程。 – Barmar

0

在这种情况下,您不需要在PDO中使用准备好的语句。

您粘贴的代码是获得动态生成的语句在纯SQL中工作的唯一方法。

由于涉及PHP,您应该在for循环中生成该SQL,并使用PDO :: query方法执行该循环。

+0

感谢Naktibalda,我知道如何做到这一点,但我想我可以使用单个查询字符串来实现它,而不涉及循环。 – praHoc