MySQL: imposta la variabile utente dal risultato della query


197

È possibile impostare una variabile utente in base al risultato di una query in MySQL?

Quello che voglio ottenere è qualcosa del genere (possiamo presumere che entrambi USERe GROUPsiano unici):

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

Nota che so che è possibile ma non desidero farlo con query nidificate.

Risposte:


333

Sì, ma è necessario spostare l'assegnazione della variabile nella query:

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

Caso di prova:

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

Risultato:

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)

Si noti che per SET, o =o :=può essere utilizzato come operatore di assegnazione. Tuttavia, all'interno di altre istruzioni, l'operatore di assegnazione deve essere :=e non =perché =viene trattato come operatore di confronto in istruzioni non SET.


AGGIORNARE:

In seguito ai commenti di seguito, è anche possibile effettuare le seguenti operazioni:

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

3
A proposito, potresti sopprimere l'output della prima istruzione (come unica assegnazione di variabili) e mostrare solo l'output della seconda query?
Avada Kedavra,

3
@Avada: aggiornata la mia risposta con un'alternativa, che non genera un risultato per l'assegnazione variabile.
Daniel Vassallo,

1
@DanielVassallo, c'è anche select grop into @group from user limit 1.
Pacerier

@DanielVassallo grazie mille. La dichiarazione "INTO" è molto utile. Stavo cercando di impostare mysql var da select senza restituire la selezione. GRAZIE!
Luis Antonio Pestana,

68

Aggiungi solo parentesi attorno alla query:

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

Questo risulta Subquery returns more than 1 rowper me
timbroder

1
@timbroder Basta aggiungere LIMIT 1 alla query. Comunque, ho suggerito una modifica per correggerlo.
Youkko,

12

Per prima cosa diamo un'occhiata a come possiamo definire una variabile in mysql

Per definire una variabile in mysql, dovrebbe iniziare con '@' come @ {nome_variata} e questo '{nome_variata}', possiamo sostituirlo con il nostro nome di variabile.

Ora, come assegnare un valore in una variabile in mysql. Per questo abbiamo molti modi per farlo

  1. Utilizzando la parola chiave "SET".

Esempio :-

mysql >  SET @a = 1;
  1. Senza utilizzare la parola chiave "SET" e utilizzando ": =".

Esempio:-

mysql > @a:=1;
  1. Usando l'istruzione 'SELECT'.

Esempio:-

mysql > select 1 into @a;

Qui @a è una variabile definita dall'utente e 1 verrà assegnato in @a.

Ora come ottenere o selezionare il valore di @ {nome_variabile}.

possiamo usare un'istruzione select come

Esempio :-

mysql > select @a;

mostrerà l'output e mostrerà il valore di @a.

Ora come assegnare un valore da una tabella in una variabile.

Per questo possiamo usare due istruzioni come: -

1.

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

Fai sempre attenzione emp_name deve restituire un singolo valore, altrimenti genererai un errore in questo tipo di istruzioni.

fare riferimento a questo: - http://www.easysolutionweb.com/sql-pl-sql/how-to-assign-a-value-in-a-variable-in-mysql


7

Utilizzare in questo modo in modo che il risultato non venga visualizzato durante l'esecuzione procedura memorizzata.

La domanda:

SELECT a.strUserID FROM tblUsers a WHERE a.lngUserID = lngUserID LIMIT 1 INTO @strUserID;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.