2015-09-11 58 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