MySQL: establece la variable de usuario a partir del resultado de la consulta


197

¿Es posible establecer una variable de usuario basada en el resultado de una consulta en MySQL?

Lo que quiero lograr es algo como esto (podemos suponer que ambos USERy GROUPson únicos):

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

Tenga en cuenta que sé que es posible, pero no deseo hacer esto con consultas anidadas.

Respuestas:


333

Sí, pero debe mover la asignación de variable a la consulta:

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

Caso de prueba:

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

Resultado:

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)

Tenga en cuenta que para SET, ya sea =o :=se puede utilizar como operador de asignación. Sin embargo, dentro de otras declaraciones, el operador de asignación debe ser :=y no =porque =se trata como un operador de comparación en las declaraciones que no son SET.


ACTUALIZAR:

Además de los comentarios a continuación, también puede hacer lo siguiente:

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

3
Por cierto, ¿podría suprimir el resultado de la primera instrucción (como su única asignación variable) y solo mostrar el resultado de la segunda consulta?
Avada Kedavra

3
@Avada: Actualicé mi respuesta con una alternativa, que no genera un resultado para la asignación de variable.
Daniel Vassallo

1
@DanielVassallo, también lo hay select grop into @group from user limit 1.
Pacerier 01 de

@DanielVassallo muchas gracias. La declaración "INTO" es muy útil. Estaba buscando configurar mysql var desde select sin devolver el select. ¡GRACIAS!
Luis Antonio Pestana

68

Simplemente agregue paréntesis alrededor de la consulta:

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

Esto resulta Subquery returns more than 1 rowpara mí
timbroder

1
@timbroder Simplemente agregue LIMIT 1 a la consulta. De todos modos, sugerí una edición para corregir eso.
Youkko

12

Primero echemos un vistazo a cómo podemos definir una variable en mysql

Para definir una variable en mysql, debe comenzar con '@' como @ {variable_name} y este '{variable_name}', podemos reemplazarlo con nuestro nombre de variable.

Ahora, cómo asignar un valor en una variable en mysql. Para esto tenemos muchas formas de hacerlo

  1. Usando la palabra clave 'SET'.

Ejemplo:

mysql >  SET @a = 1;
  1. Sin usar la palabra clave 'SET' y usar ': ='.

Ejemplo:-

mysql > @a:=1;
  1. Mediante el uso de la declaración 'SELECCIONAR'.

Ejemplo:-

mysql > select 1 into @a;

Aquí @a es una variable definida por el usuario y 1 se asignará en @a.

Ahora, cómo obtener o seleccionar el valor de @ {variable_name}.

podemos usar la instrucción select como

Ejemplo:

mysql > select @a;

mostrará la salida y mostrará el valor de @a.

Ahora cómo asignar un valor de una tabla en una variable.

Para esto podemos usar dos afirmaciones como: -

1)

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

Siempre tenga cuidado, emp_name debe devolver un valor único; de lo contrario, arrojará un error en este tipo de declaraciones.

consulte esto: - http://www.easysolutionweb.com/sql-pl-sql/how-to-assign-a-value-in-a-variable-in-mysql


7

Use esta forma para que el resultado no se muestre mientras se ejecuta el procedimiento almacenado.

La consulta:

SELECT a.strUserID FROM tblUsers a WHERE a.lngUserID = lngUserID LIMIT 1 INTO @strUserID;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.