将查询结果分配到MySQL过程中的变量中

时间:2017-08-26 17:39:03

标签: mysql sql variables stored-procedures

以下是我的程序中的一段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次作为组连接字符串,第二次就像结果列表不是我的解决方案。所以,我需要它们作为存储在变量中的集合。

3 个答案:

答案 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);