MySQL: установить пользовательскую переменную из результата запроса

198

Можно ли установить пользовательскую переменную на основе результата запроса в MySQL?

То, чего я хочу достичь, это что-то вроде этого (мы можем предположить, что оба USERи GROUPявляются уникальными):

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

Обратите внимание, что я знаю, что это возможно, но я не хочу делать это с вложенными запросами.

Авада Кедавра
источник

Ответы:

334

Да, но вам нужно переместить присваивание переменной в запрос:

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

Прецедент:

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

Результат:

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)

Обратите внимание , что для SETлибо =или :=может быть использован в качестве оператора присваивания. Однако внутри других операторов оператор присваивания должен быть, :=а не =потому, что =он рассматривается как оператор сравнения в операторах не-SET.


ОБНОВИТЬ:

В дополнение к комментариям ниже, вы также можете сделать следующее:

SET @user := 123456;
SELECT `group` FROM user LIMIT 1 INTO @group; 
SELECT * FROM user WHERE `group` = @group;
Даниэль Вассалло
источник
3
Кстати, не могли бы вы подавить вывод первого оператора (как единственное присвоение переменной) и показать только вывод второго запроса?
Авада Кедавра
3
@ Avada: обновил мой ответ альтернативой, которая не выводит результат для назначения переменной.
Даниэль Вассалло
1
@DanielVassallo, есть также select grop into @group from user limit 1.
Pacerier
@DanielVassallo большое спасибо. Устав "INTO" очень полезен. Я искал установку mysql var из select без возврата select. СПАСИБО!
Луис Антонио Пестана
68

Просто добавьте круглые скобки вокруг запроса:

set @user = 123456;
set @group = (select GROUP from USER where User = @user);
select * from USER where GROUP = @group;
SdZ
источник
Это приводит Subquery returns more than 1 rowк мне
timbroder
1
@timbroder Просто добавьте LIMIT 1 к запросу. Во всяком случае, я предложил изменить, чтобы исправить это.
Youkko
12

Сначала давайте посмотрим, как мы можем определить переменную в MySQL

Чтобы определить переменную в mysql, она должна начинаться с '@', например @ {имя_переменной} и этим {{переменная_имя}}, мы можем заменить ее именем нашей переменной.

Теперь, как назначить значение в переменной в MySQL. Для этого у нас есть много способов сделать это

  1. Используя ключевое слово «SET».

Пример :-

mysql >  SET @a = 1;
  1. Без использования ключевого слова «SET» и использования «: =».

Пример:-

mysql > @a:=1;
  1. Используя оператор SELECT.

Пример:-

mysql > select 1 into @a;

Здесь @a - определяемая пользователем переменная, и 1 будет назначен в @a.

Теперь, как получить или выбрать значение @ {variable_name}.

мы можем использовать оператор выбора как

Пример :-

mysql > select @a;

он покажет вывод и покажет значение @a.

Теперь, как назначить значение из таблицы в переменной.

Для этого мы можем использовать два утверждения типа: -

1.

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

Всегда будьте осторожны, emp_name должно возвращать одно значение, иначе это приведет к ошибке в выражениях этого типа.

см. это: - http://www.easysolutionweb.com/sql-pl-sql/how-to-assign-a-value-in-a-variable-in-mysql

дилрадж сингх
источник
7

Используйте этот способ, чтобы результат не отображался при выполнении хранимой процедуры.

Запрос:

SELECT a.strUserID FROM tblUsers a WHERE a.lngUserID = lngUserID LIMIT 1 INTO @strUserID;
Rupam
источник