Je cherchais un moyen d'implémenter une requête croisée dans MySQL et j'ai trouvé la réponse dans ce post : Afficher les dates en lignes sous forme de colonnes dynamiques dans MySQL. J'ai essayé la requête et je l'ai fait fonctionner, mais comment écrire la requête en PHP en utilisant le style procédural MySQL. Voici la requête :
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(`week_start` = "', `week_start`,'", `weekly_value`,0)) AS "',DATE(`week_start`),'"') ) INTO @sql FROM (SELECT * FROM crosstab WHERE `week_start` BETWEEN NOW() - INTERVAL 4 WEEK AND NOW()) t1; SET @sql = CONCAT('SELECT s.`ID`, s.`name`, ', @sql, ' FROM (SELECT * FROM crosstab WHERE `week_start` BETWEEN NOW() - INTERVAL 4 WEEK AND NOW()) s GROUP BY s.`name` ORDER BY s.`ID`'); SELECT @sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; $sql = "SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(`week_start` = \"', `week_start`,'\", `weekly_value`,0)) AS \"',DATE(`week_start`),'\"') ) INTO @sql FROM (SELECT * FROM crosstab WHERE `week_start` BETWEEN NOW() - INTERVAL 4 WEEK AND NOW()) t1; SET @sql = CONCAT('SELECT s.`ID`, s.`name`, ', @sql, ' FROM (SELECT * FROM crosstab WHERE `week_start` BETWEEN NOW() - INTERVAL 4 WEEK AND NOW()) s GROUP BY s.`name` ORDER BY s.`ID`'); SELECT @sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;"; // echo $sql; // exit; $report_query = mysqli_query($conn, $sql);
Si j'imprime le SQL généré et que je le colle dans PHPMyAdmin, la requête s'exécute correctement mais donne une erreur de syntaxe SQL sur php "Erreur fatale : mysqli_sql_exception non interceptée : il y a une erreur dans votre syntaxe SQL ; consultez le manuel approprié pour la version de votre serveur MariaDB. pour obtenir la syntaxe correcte à utiliser autour de 'SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(week_start
=...' at line 2 in.."). Existe-t-il un moyen d'écrire la requête en php ? < /p>
Et ça ?