Démonstration de l'approche de table virtuelle/temporaire SQL : extraction de données à partir d'un tableau associatif
P粉066224086
2023-09-03 16:26:28
<p>J'ai besoin d'une simple requête SQL pour afficher une table virtuelle/temporaire sans la créer dans la base de données. </p>
<p>J'utilise PHP pour créer une chaîne de requête avec des données. </p>
<p>Mon code PHP actuel est : </p>
<pre class="brush:php;toolbar:false;">$array = [
['id' => 1, 'nom' =>
['id' => 2, 'nom' =>
['id' => 3, 'nom' =>
];
$subQuery = "SELECT {$array[0]['id']} AS col1, '{$array[0]['name']}' AS col2";
pour ($i=1; $i < count ($array); $i++) {
$subQuery .= " UNION ALL SELECT {$array[$i]['id']}, '{$array[$i]['name']}'"
}
$sql = "AVEC cte AS
(
{$sous-requête}
)
SELECT col1, col2 FROM cte;";
echo $sql;</pre>
<p>Sa sortie est : </p>
<pre class="brush:php;toolbar:false;">AVEC cte AS
(
SELECT 1 AS col1, 'un' AS col2 UNION ALL SELECT 2, 'deux' UNION ALL SELECT 3, 'trois'
)
SELECT col1, col2 FROM cte;
// Table de sortie du SQL
col1 col2
1 un
2 deux
3 trois≪/pre>
<p>J'ai eu l'idée de cette requête à partir d'ici. </p>
<p>Mais le problème avec cette requête est que s'il y a 100 données dans $array, la partie <strong>UNION ALL</strong> sera incluse 100 fois dans le SQL. Je ne pense pas que ce soit un meilleur SQL car c'est comme rejoindre 100 tables en même temps. </p>
<p>Je pourrais également créer une table temporaire (<strong>CREATE TEMPORARY TABLE table_name</strong>) à la place de cette clause <strong>WITH</strong> Une autre requête est nécessaire pour insérer des enregistrements dans la table temporaire. </p>
<p>Quelqu'un peut-il m'aider à mieux simplifier cette requête ? </p>
Lorsque vous utilisez MySQL 8, vous pouvez utiliser
json_table
des expressions comme celle-ci :Éditeur PHP en ligne
Dans MySQL 8.0, les résultats de la requête ci-dessus sont les suivants :