Maison > base de données > tutoriel mysql > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-28 08:09:01
original
255 Les gens l'ont consulté

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);
Copier après la connexion

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"];
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal