【问题标题】:Assigning query's results into variable inside MySQL procedure将查询结果分配给 MySQL 过程中的变量
【发布时间】:2017-08-26 17:39:03
【问题描述】:

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

【问题讨论】:

    标签: mysql sql variables stored-procedures


    【解决方案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 的用途。

    【讨论】:

    • 先生,您看,这个程序生成随机组合。在生成之后,我正在检查这个组合的 id 是否存在于先前生成的组合中,所以我需要相同的组合来生成连接和检查。如果我没听错的话,您建议多次调用该查询。但这不是我的情况的解决方案
    • 为了清楚起见,我正在粘贴完整过程的 sql:pastebin.com/dj4RNXkX
    • 问题的根源在这里:stackoverflow.com/q/45057324/971388我正在研究这种方法,因为答案之一:stackoverflow.com/a/45878858/971388
    【解决方案2】:

    所以问题是,我做错了什么?

    您做错了尝试将结果集存储在用户变量中。

    https://dev.mysql.com/doc/refman/5.7/en/user-variables.html 说:

    可以从一组有限的数据类型中为用户变量分配一个值:整数、十进制、浮点、二进制或非二进制字符串,或 NULL 值。

    这种变量不能存储数组或结果集。只有一个标量值。

    这个问题的代码似乎与Checking and preventing similar strings while insertion in MySQL有关

    【讨论】:

      【解决方案3】:

      您应该尝试以下解决方案来克服存储大数据的问题,它可能有助于其他人也在寻找解决方案:

      # 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-14
        • 2022-01-06
        相关资源
        最近更新 更多