MySQL: définir la variable utilisateur à partir du résultat de la requête

197

Est-il possible de définir une variable utilisateur en fonction du résultat d'une requête dans MySQL?

Ce que je veux réaliser, c'est quelque chose comme ça (nous pouvons supposer que les deux USERet GROUPsont uniques):

set @user = 123456;
set @group = select GROUP from USER where User = @user;
select * from USER where GROUP = @group;

Veuillez noter que je sais que c'est possible, mais je ne souhaite pas le faire avec des requêtes imbriquées.

Avada Kedavra
la source

Réponses:

333

Oui, mais vous devez déplacer l'affectation de variable dans la requête:

SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;

Cas de test:

CREATE TABLE user (`user` int, `group` int);
INSERT INTO user VALUES (123456, 5);
INSERT INTO user VALUES (111111, 5);

Résultat:

SET @user := 123456;
SELECT @group := `group` FROM user WHERE user = @user;
SELECT * FROM user WHERE `group` = @group;

+--------+-------+
| user   | group |
+--------+-------+
| 123456 |     5 |
| 111111 |     5 |
+--------+-------+
2 rows in set (0.00 sec)

Notez que pour SET, l'un =ou l' autre :=peut être utilisé comme opérateur d'affectation. Cependant, à l'intérieur d'autres instructions, l'opérateur d'affectation doit être :=et non =parce qu'il =est traité comme un opérateur de comparaison dans les instructions non SET.


METTRE À JOUR:

Suite aux commentaires ci-dessous, vous pouvez également effectuer les opérations suivantes:

SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group; 
SELECT * FROM user WHERE `group` = @group;
Daniel Vassallo
la source
3
Btw, pourriez-vous supprimer la sortie de la première instruction (comme sa seule affectation de variable) et n'afficher que la sortie de la deuxième requête?
Avada Kedavra
3
@Avada: Mise à jour de ma réponse avec une alternative, qui ne produit pas de résultat pour l'affectation de variable.
Daniel Vassallo
1
@DanielVassallo, il y en a aussi select grop into @group from user limit 1.
Pacerier
@DanielVassallo merci beaucoup. La déclaration "INTO" est très utile. Je cherchais à configurer mysql var de select sans retourner le select. MERCI!
Luis Antonio Pestana
68

Ajoutez simplement des parenthèses autour de la requête:

set @user = 123456;
set @group = (select GROUP from USER where User = @user);
select * from USER where GROUP = @group;
Sdz
la source
Cela se traduit Subquery returns more than 1 rowpour moi
timbroder
1
@timbroder Ajoutez simplement LIMIT 1 à la requête. Quoi qu'il en soit, j'ai suggéré une modification pour corriger cela.
Youkko
12

Voyons d'abord comment définir une variable dans mysql

Pour définir une variable dans mysql, elle doit commencer par '@' comme @ {variable_name} et ce '{variable_name}', nous pouvons le remplacer par notre nom de variable.

Maintenant, comment assigner une valeur à une variable dans mysql. Pour cela, nous avons de nombreuses façons de le faire

  1. Utiliser le mot-clé 'SET'.

Exemple :-

mysql >  SET @a = 1;
  1. Sans utiliser le mot clé 'SET' et en utilisant ': ='.

Exemple:-

mysql > @a:=1;
  1. En utilisant l'instruction 'SELECT'.

Exemple:-

mysql > select 1 into @a;

Ici, @a est une variable définie par l'utilisateur et 1 va être attribué dans @a.

Maintenant, comment obtenir ou sélectionner la valeur de @ {nom_variable}.

nous pouvons utiliser l'instruction select comme

Exemple :-

mysql > select @a;

il affichera la sortie et affichera la valeur de @a.

Maintenant, comment attribuer une valeur à partir d'une table dans une variable.

Pour cela, nous pouvons utiliser deux déclarations comme: -

1.

@a := (select emp_name from employee where emp_id = 1);
select emp_name into @a from employee where emp_id = 1;

Soyez toujours prudent, emp_name doit renvoyer une valeur unique, sinon cela vous générera une erreur dans ces instructions de type.

référez-vous à ceci: - http://www.easysolutionweb.com/sql-pl-sql/how-to-assign-a-value-in-a-variable-in-mysql

dilraj singh
la source
7

Utilisez cette méthode pour que le résultat ne s'affiche pas lors de l'exécution de la procédure stockée.

La requête:

SELECT a.strUserID FROM tblUsers a WHERE a.lngUserID = lngUserID LIMIT 1 INTO @strUserID;
Rupam
la source