如何使用MySQL将查询结果存储在变量中

117
SET @v1 := SELECT COUNT(*) FROM user_rating;
SELECT @v1

当我使用 set 变量执行此查询时,会显示此错误。

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
near 'SELECT count(*) FROM user_rating' at line 1

Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

(1 row(s) returned)
Execution Time : 00:00:00:343
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:343

https://dev59.com/2G025IYBdhLWcg3wUEOP#6081523 - Ravi Parekh
6个回答

180

用括号将该选择器括起来。

SET @v1 := (SELECT COUNT(*) FROM user_rating);
SELECT @v1;

22
这个子查询是否只应该包含1行1列呢?1.#1242 - 子查询返回多于1行 , 2. #1241 - 操作数应该只包含1列 - Shafizadeh
1
@RajatGupta:你在哪里运行它?并且定义一下“不工作”的具体表现。 - Sergio Tulentsev
5
是的,那个子查询应该只返回一个行和一列。 - Sergio Tulentsev
1
@Black:也许其他的答案会起作用。 - Sergio Tulentsev
3
似乎返回值必须是一个,而不是一组值。 - Victor S
显示剩余4条评论

46

此外,如果您希望通过一个查询同时设置多个变量,可以使用另一种设置变量的语法,如下所示:SELECT @varname:=value

一个实际的例子:

SELECT @total_count:=COUNT(*), @total_price:=SUM(quantity*price) FROM items ...

12

使用这个

 SELECT weight INTO @x FROM p_status where tcount='value' LIMIT 1;

测试过并且工作良好...


5
Select count(*) from table_name into @var1; 
Select @var1;

1

如果您想将查询结果保存为临时表以便在后续查询中重复使用,请使用MySQL的CREATE TEMPORARY TABLE

参见:https://dev.mysql.com/doc/refman/8.0/en/create-temporary-table.html

DROP TEMPORARY TABLE IF EXISTS myDb.temp_variable;
CREATE TEMPORARY TABLE myDb.temp_variable SELECT * FROM myDb.student ORDER BY id DESC LIMIT 25;
SELECT * FROM myDb.temp_variable;

DROP TEMPORARY TABLE IF EXISTS myDb.temp_variable;

0
如果你想在 SELECT... WHERE... IN (*here*) 语句中使用变量,可以使用 GROUP_CONCATfind_in_set
-- initialise with a comma-separated string
SET @emails = 'test1@example.com,test2@example.com,test3@example.com';

-- search condition
SELECT * FROM customer WHERE find_in_set(email, @emails);

-- or, you can initialise the variable using query results
SELECT GROUP_CONCAT(phone) INTO @activeCustomerPhones FROM customer WHERE status = 'ACTIVE';

SELECT * FROM transaction WHERE find_in_set(phone, @activeCustomerPhones);

/* 
customer:
- phone
- email
- status 

transaction:
- phone
*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接