Maison  >  Article  >  base de données  >  Comment créer dynamiquement des tableaux croisés dans MySQL avec des noms de colonnes variables ?

Comment créer dynamiquement des tableaux croisés dans MySQL avec des noms de colonnes variables ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 08:09:01161parcourir

How to Dynamically Create Cross-Tabulations in MySQL with Varying Column Names?

Tabulation croisée dynamique MySQL

Problème :

Considérez une table contenant des attributs tels que " chemin", "arrêt" et "heure". L'objectif est de transformer ces données dans un format croisé, où les colonnes représentent des valeurs « chemin » distinctes et les lignes représentent des valeurs « arrêt ». Chaque cellule contient le « temps » maximum enregistré pour la combinaison « chemin » et « arrêt » correspondante.

Solution dynamique :

Les limitations de MySQL dictent que les noms et numéros de colonnes doit être corrigé lors de l’exécution de la requête. Pour surmonter ce défi, envisagez deux approches basées sur les applications :

Option 1 : interroger des valeurs distinctes

  • Récupérer des valeurs de « manière » distinctes à l'aide d'une requête SELECT DISTINCT .
  • Construisez dynamiquement une requête pivot en ajoutant les clauses MAX(IF()) nécessaires à la liste SELECT.
  • Exécutez la requête pivot générée pour obtenir le résultat croisé souhaité.

Option 2 : Traitement ligne par ligne

  • Interrogez les données ligne par ligne à l'aide d'une simple requête SELECT *.
  • Créez un tableau associatif qui stocke "stop" comme clé et un tableau de valeurs "way" et les valeurs "time" correspondantes comme valeur.
  • Traitez chaque ligne, en remplissant les valeurs way_n dans le "stop" associé. " tableau de clés.

Mise en œuvre :

Pour l'option 1 :

$way_array = [];
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`";
$pivotstmt = $pdo->query($pivotsql);

Pour l'option 2 :

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

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