2017-08-26 55 views
0

這裏面是從我的程序塊的sql:指定查詢的結果爲可變的MySQL程序

.... 
    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變量上的某個標識:find_in_set( item_id , @list) 並且查詢每次調用它時都會返回隨機結果。 這就是爲什麼,調用子查詢2次:1次作爲組concat字符串,第二次就像結果列表不是我的解決方案。所以,我需要它們作爲一個存儲在變量中的集合。

回答

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。

+0

先生,你看,這個程序生成隨機組合代碼。並且在生成後,我將檢查此組合的ID是否存在於先前生成的組合上,因此我需要使用相同的組合來生成串聯和檢查。如果我找對了,你建議多次調用該查詢。但這不是我的情況的解決方案 – demonoid

+0

爲了說清楚,我正在粘貼完整的程序的sql:https://pastebin.com/dj4RNXkX – demonoid

+0

問題的根源在這裏:https://stackoverflow.com/q/45057324/971388由於答案之一,我正在處理這個問題:https://stackoverflow.com/a/45878858/971388 – demonoid

0

所以問題是,我做錯了什麼?

你做錯了什麼是嘗試將結果集存儲在用戶變量中。

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

User variables can be assigned a value from a limited set of data types: integer, decimal, floating-point, binary or nonbinary string, or NULL value.

這種變量不能存儲陣列或結果集。只有一個標量值。

這個問題有,這似乎是與Checking and preventing similar strings while insertion in MySQL