Maison >base de données >tutoriel mysql >Comment créer dynamiquement des tableaux croisés dans MySQL ?

Comment créer dynamiquement des tableaux croisés dans MySQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 09:27:30839parcourir

How to Dynamically Create Cross-Tabulated Tables in MySQL?

Tableau croisé dynamique MySQL

Problème :

Vous disposez d'une table contenant des données à plusieurs dimensions et vous souhaitez créer un tableau croisé (tableau croisé dynamique) de manière dynamique sans connaître au préalable le nombre de dimensions.

Solution :

Le nombre de colonnes pour une requête pivot doit être défini au moment de la préparation de la requête. Pour réaliser une tabulation croisée dynamique, vous disposez de deux options qui impliquent l'écriture de code d'application :

Option 1 : interroger des valeurs distinctes et construire du SQL dynamique

  1. Requête pour valeurs distinctes dans la dimension que vous souhaitez faire pivoter (par exemple, "way").
  2. Créez un tableau de fragments SQL représentant la durée maximale pour chaque valeur de dimension distincte.
  3. Joignez les fragments SQL dans une seule chaîne de requête à l'aide de virgules.
  4. Exécutez la requête pivot dynamique avec la chaîne SQL construite.

Exemple :

<code class="php">foreach ($pdo->query("SELECT DISTINCT `way` FROM `MyTable`") as $row) {
  $way = (int) $row["way"];
  $way_array[] = "MAX(IF(`way`=$way, `time`)) AS way_$way";
}
$pivotsql = "SELECT stop, " . join(", ", $way_array) .
   "FROM `MyTable` GROUP BY `stop`";</code>

Option 2 : Interroger et post-traiter les données ligne par ligne

  1. Interroger les données telles quelles.
  2. Créer un tableau associatif en utilisant la première valeur de dimension (par ex. , "stop") comme clé.
  3. Remplissez le tableau avec des sous-tableaux contenant la deuxième valeur de dimension (par exemple, "way") comme clés et des valeurs de temps comme valeurs.
  4. Le tableau résultant sera ressembler aux données d'une requête pivot.

Exemple :

<code class="php">$stoparray = array();
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
  $stopkey = $row["stop"];
  if (!array_key_exists($stopkey, $stoparray)) {
    $stoparray[$stopkey] = array("stop"=>$stopkey);
  }
  $waykey = "way_" . $row["way"];
  $stoparray[$stopkey][$waykey] = $row["time"];
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn