This is my code at the moment
$piv0 = "SET @pivot_query = NULL;";
$piv1 = "SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(custom_field = \"\"',custom_field,\"\"', cf_values, NULL)) AS ',custom_field)) INTO @pivot_query FROM custom_fields_values; ";
$piv2 = "SET @pivot = CONCAT('SELECT subscriber_id, ', @pivot_query, ' FROM custom_fields_values GROUP BY subscriber_id');";
$piv3 = "SET @sql = CONCAT('SELECT * FROM user_data_3 LEFT JOIN (',@pivot,') piv ON user_data_5.aw_id = piv.subscriber_id');";
$piv4 = "PREPARE stmt FROM @sql; ";
$piv5 = "EXECUTE stmt;";
$piv6 = "DEALLOCATE PREPARE stmt;";
$db = DB::connection()->pdo;
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$query = $db->prepare($piv0);
$query->execute();
$query = $db->prepare($piv1);
$query->execute();
$query = $db->prepare($piv2);
$query->execute();
$query = $db->prepare($piv3);
$query->execute();
$query = $db->prepare($piv4);
$query->execute();
$query = $db->prepare($piv5);
$query->execute();
$query = $db->prepare($piv6);
$query->execute();
$result = $query->fetchAll();
However, I am getting the error:
General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
I looked at some other SO questions and it was mentioned that $query->fetchAll()
and/or $query->closeCursor()
should help, but they didn't help me here.
I am getting the error on $query = $db->prepare($piv4);
What else should I try?
I managed to come up with a workaround:
$middleQueryRes = DB::query("SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(custom_field =''', custom_field,''', cf_values, NULL)) AS ',custom_field)) FROM custom_fields_values;");
foreach ($middleQueryRes[0] as $value) {
$middleQueryRes = $value
break;
}
$middleQuery2 = "SELECT subscriber_id, $middleQueryRes FROM custom_fields_values GROUP BY subscriber_id";
$finalRes = DB::query("SELECT * FROM user_data_3 LEFT JOIN ($middleQuery2) piv ON user_data_5.aw_id = piv.subscriber_id");