Maison >base de données >tutoriel mysql >L'instruction Select de MySQL peut-elle utiliser et redéfinir de manière fiable les variables utilisateur au sein d'une seule instruction ?

L'instruction Select de MySQL peut-elle utiliser et redéfinir de manière fiable les variables utilisateur au sein d'une seule instruction ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-03 10:41:17147parcourir

Can MySQL's Select Statement Reliably Use and Redefine User Variables Within a Single Statement?

Définir et utiliser des variables dans une instruction Select

Dans MySQL, il n'est généralement pas conseillé d'attribuer des valeurs aux variables utilisateur et de lire ces valeurs dans la même déclaration. Bien qu'il puisse sembler fonctionner dans certains scénarios, ce comportement n'est pas garanti et peut varier en fonction des éléments spécifiques de l'instruction et de la version du serveur MySQL.

Par exemple, considérons l'instruction suivante :

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;

Dans ce cas, le résultat attendu serait que la deuxième colonne renvoie la valeur de 2 multipliée par la somme de la colonne élément. Cependant, MySQL peut évaluer l'instruction dans un ordre différent, ce qui entraîne une valeur NULL pour la deuxième colonne.

La raison derrière ce comportement est que MySQL ne garantit pas l'ordre d'évaluation des expressions impliquant des variables utilisateur. En modifiant légèrement l'instruction, par exemple en introduisant une clause GROUP BY, l'ordre d'évaluation peut changer.

Cependant, il existe une solution de contournement pour obtenir la fonctionnalité souhaitée en utilisant une sous-requête :

select @z, @z*2
from (SELECT @z:=sum(item)
      FROM TableA
     ) t;

Dans cette sous-requête, la variable @z se voit attribuer la somme de la colonne d'éléments puis est sélectionnée avec sa valeur doublée. Cette approche garantit que la valeur de la variable est correctement évaluée et utilisée dans la deuxième colonne.

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