MySQL: Benutzervariable aus dem Ergebnis der Abfrage festlegen


195

Ist es möglich, eine Benutzervariable basierend auf dem Ergebnis einer Abfrage in MySQL festzulegen?

Was ich erreichen möchte, ist so etwas (wir können davon ausgehen, dass beide USERund GROUPeinzigartig sind):

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

Bitte beachten Sie, dass ich weiß, dass dies möglich ist, dies jedoch nicht mit verschachtelten Abfragen tun möchte.

Antworten:


330

Ja, aber Sie müssen die Variablenzuweisung in die Abfrage verschieben:

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

Testfall:

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

Ergebnis:

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)

Beachten Sie, dass für SETentweder =oder :=als Zuweisungsoperator verwendet werden kann. In anderen Anweisungen muss der Zuweisungsoperator jedoch sein :=und nicht, =da er =in Nicht-SET-Anweisungen als Vergleichsoperator behandelt wird.


AKTUALISIEREN:

Neben den Kommentaren unten können Sie auch Folgendes tun:

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

3
Übrigens, könnten Sie die Ausgabe der ersten Anweisung (als einzige Variablenzuweisung) unterdrücken und nur die Ausgabe der zweiten Abfrage anzeigen?
Avada Kedavra

3
@ Avada: Meine Antwort wurde mit einer Alternative aktualisiert, die kein Ergebnis für die Variablenzuweisung ausgibt.
Daniel Vassallo

1
@ DanielVassallo, gibt es auch select grop into @group from user limit 1.
Pacerier

@ DanielVassallo vielen Dank. Die Aussage "INTO" ist sehr hilfreich. Ich wollte mysql var von select einstellen, ohne die select zurückzugeben. VIELEN DANK!
Luis Antonio Pestana

68

Fügen Sie einfach eine Klammer um die Abfrage hinzu:

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

Dies führt Subquery returns more than 1 rowfür mich
Timbroder

1
@timbroder Fügen Sie der Abfrage einfach LIMIT 1 hinzu. Wie auch immer, ich schlug eine Bearbeitung vor, um das zu korrigieren.
Youkko

11

Schauen wir uns zunächst an, wie wir eine Variable in MySQL definieren können

Um eine Variable in MySQL zu definieren, sollte sie mit '@' wie @ {Variablenname} und diesem '{Variablenname}' beginnen. Wir können sie durch unseren Variablennamen ersetzen.

Nun, wie man einen Wert in einer Variablen in MySQL zuweist. Dafür haben wir viele Möglichkeiten, das zu tun

  1. Verwenden Sie das Schlüsselwort 'SET'.

Beispiel: - mysql> SET @a = 1;

  1. Ohne das Schlüsselwort 'SET' und ': =' zu verwenden.

Beispiel: - mysql> @a: = 1;

  1. Mit der Anweisung 'SELECT'.

Beispiel: - mysql> wähle 1 in @a;

Hier ist @a eine benutzerdefinierte Variable und 1 wird in @a zugewiesen.

Nun, wie man den Wert von @ {Variablenname} erhält oder auswählt.

Wir können select-Anweisungen wie verwenden

Beispiel: -

mysql> wähle @a;

Es wird die Ausgabe und der Wert von @a angezeigt.

Nun, wie man einen Wert aus einer Tabelle in einer Variablen zuweist.

Hierfür können wir zwei Aussagen verwenden wie: -

  1. @a: = (Wählen Sie emp_name vom Mitarbeiter aus, wobei emp_id = 1 ist);

  2. Wählen Sie emp_name in @a von Mitarbeiter aus, wobei emp_id = 1;

Seien Sie immer vorsichtig, emp_name muss einen einzelnen Wert zurückgeben, da sonst ein Fehler in diesen Typanweisungen auftritt.

Verweisen Sie darauf: - http://www.easysolutionweb.com/sql-pl-sql/how-to-assign-a-value-in-a-variable-in-mysql


7

Verwenden Sie diese Methode, damit das Ergebnis beim Ausführen der gespeicherten Prozedur nicht angezeigt wird.

Die Abfrage:

SELECT a.strUserID FROM tblUsers a WHERE a.lngUserID = lngUserID LIMIT 1 INTO @strUserID;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.