MySQL: Definir variável de usuário a partir do resultado da consulta

195

É possível definir uma variável de usuário com base no resultado de uma consulta no MySQL?

O que eu quero alcançar é algo como isto (podemos supor que tanto USERe GROUPsão originais):

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

Observe que eu sei que é possível, mas não desejo fazer isso com consultas aninhadas.

Feitiço da morte
fonte

Respostas:

330

Sim, mas você precisa mover a atribuição de variável para a consulta:

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

Caso de teste:

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)

Observe que SET, para =ou :=pode ser usado como operador de atribuição. No entanto, dentro de outras instruções, o operador de atribuição deve ser :=e não =porque =é tratado como um operador de comparação em instruções não SET.


ATUALIZAR:

Além dos comentários abaixo, você também pode fazer o seguinte:

SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group; 
SELECT * FROM user WHERE `group` = @group;
Daniel Vassallo
fonte
3
Btw, você poderia suprimir a saída da primeira instrução (como sua única atribuição de variável) e mostrar apenas a saída da segunda consulta?
Avada Kedavra
3
@Avada: Atualizei minha resposta com uma alternativa, que não gera um resultado para a atribuição de variável.
Daniel Vassallo
1
@DanielVassallo, Há também select grop into @group from user limit 1.
Pacerier
@DanielVassallo muito obrigado. A declaração "INTO" é muito útil. Eu estava procurando pela configuração do mysql var do select sem retornar o select. OBRIGADO!
Luis Antonio Pestana
68

Basta adicionar parênteses em torno da consulta:

set @user = 123456;
set @group = (select GROUP from USER where User = @user);
select * from USER where GROUP = @group;
Sdz
fonte
Isso resulta Subquery returns more than 1 rowpara mim
timbroder 15/08/19
1
@timbroder Basta adicionar o LIMIT 1 à consulta. Enfim, sugeri uma edição para corrigir isso.
Youkko 6/09/19
11

Primeiro vamos dar uma olhada em como podemos definir uma variável no mysql

Para definir uma variável no mysql, ela deve começar com '@' como @ {variable_name} e este '{variable_name}', podemos substituí-lo pelo nome da variável.

Agora, como atribuir um valor em uma variável no mysql. Para isso, temos muitas maneiras de fazer isso

  1. Usando a palavra-chave 'SET'.

Exemplo: - mysql> SET @a = 1;

  1. Sem usar a palavra-chave 'SET' e usar ': ='.

Exemplo: - mysql> @a: = 1;

  1. Usando a instrução 'SELECT'.

Exemplo: - mysql> selecione 1 em @a;

Aqui @a é uma variável definida pelo usuário e 1 será atribuído em @a.

Agora, como obter ou selecionar o valor de @ {variable_name}.

podemos usar a instrução select como

Exemplo: -

mysql> selecione @a;

mostrará a saída e mostrará o valor de @a.

Agora, como atribuir um valor de uma tabela em uma variável.

Para isso, podemos usar duas instruções como: -

  1. @a: = (selecione emp_name do funcionário em que emp_id = 1);

  2. selecione emp_name em @a do funcionário em que emp_id = 1;

Sempre tome cuidado, emp_name deve retornar um valor único, caso contrário, ocorrerá um erro nas instruções deste tipo.

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

dilraj singh
fonte
7

Use desta maneira para que o resultado não seja exibido durante a execução do procedimento armazenado.

A pergunta:

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