以下是我的程序中的一段sql:
....
SET @list := (
SELECT
`i`.`id`
FROM
`Item` AS `i`
Order by RAND()
LIMIT 10
);
RETURN CONCAT_WS( '-', @list );
在内部过程中,我需要将查询结果(是的,查询返回多行作为结果)设置为某个变量。
然后作为第二个变量,我需要将以前的结果连接成一个字符串。
但是当我这样做时,我得到以下错误:
Sub-query returns more than 1 row
所以问题是,我做错了什么?
顺便说一句,我知道group_concat
。在过程的第二部分中,需要检查此@list
变量上是否存在某个ID:find_in_set(
item_id , @list )
每当我调用它时,查询都会返回随机结果。
这就是为什么,调用子查询2次:1次作为组连接字符串,第二次就像结果列表不是我的解决方案。所以,我需要它们作为存储在变量中的集合。
答案 0 :(得分:1)
你正在接近这是完全错误的方式。没有理由将ID存储在列表中。
在该过程的第二部分中,您应该只使用子查询:
where exists (select 1
from item i
where i.id = <outer table>.item_id
)
如果您确实想要将内容放入列表中,则可以使用group_concat()
,如下所示:
SELECT @list := GROUP_CONCAT(i.id ORDER BY RAND() SEPARATOR '-') as ids
FROM Item i;
我没有看到用于将值存储在变量中的用途,也没有用于随机排序ID。
答案 1 :(得分:0)
所以问题是,我做错了什么?
你做错了是试图将结果集存储在用户变量中。
https://dev.mysql.com/doc/refman/5.7/en/user-variables.html说:
可以从一组有限的数据类型中为用户变量分配值:整数,十进制,浮点,二进制或非二进制字符串或NULL值。
这种变量不能存储数组或结果集。只有一个标量值。
此问题的代码似乎与Checking and preventing similar strings while insertion in MySQL
有关答案 2 :(得分:0)
您应该尝试以下解决方案来克服存储大数据的问题,这可能会帮助其他也在寻找解决方案的人:
# sets the default 1Mb storage limit to 10Mb
SET SESSION group_concat_max_len = (1024*10);
SET @list := (SELECT GROUP_CONCAT(id) FROM `Item` AS `i` Order by RAND() LIMIT 10);