2010-06-26 107 views
2

所以我有一個格式數據像; 1 ;; 2;然後我需要在查詢中使用這個數字,所以我想我會將它轉換爲1,2並在IN條件下使用它。在我的表中,結果應該返回2行,但它只返回1行。MySQL選擇與子查詢有替換

我的查詢是這樣的。子查詢返回1,2沒有問題,但只有1行被檢索。

select * 
from wt_lists 
where id IN ((select replace (replace(sendto, ';;',','),';','') 
       from wt_stats where statsid IN (1))) 

但是當我嘗試它與此有關。它返回正確的結果,在我的情況下是2行。

select * 
    from wt_lists 
where id IN (1,2) 

我在這裏錯過了什麼?

+0

你的子查詢返回一個字符串「1,2」,而不是兩行編號1和2 ......當你選擇CAST(」 1,2'AS UNSIGNED),你會得到1 – simendsjo 2010-06-26 11:54:37

+1

如果可能的話,我建議解析應用程序邏輯中的數據併發送一個乾淨的逗號分隔的字符串給MySQL – 2010-06-26 12:01:09

+0

我同意David的觀點。從MySQL執行此操作似乎很麻煩。我發現這個存儲過程:http://forge.mysql.com/tools/tool.php?id=4 – simendsjo 2010-06-26 12:09:06

回答

3

逗號分隔的字符串需要在查詢中明確定義才能在IN子句中使用 - 在SO上有無數例子,人們需要使用動態SQL來合併用戶提交的逗號分隔字符串。

這麼說,我有使用溶液的FIND_IN_SET function

SELECT DISTINCT wl.* 
    FROM WT_LISTS wl 
    JOIN (SELECT REPLACE(REPLACE(ws.sendto, ';;',','),';','') AS ids 
      FROM WT_STATS ws 
     WHERE ws.statsid = 1) x ON FIND_IN_SET(wl.id, x.ids) > 0 
1

要替換的字符串:

';1;;2;'

要:

'1,2'

所以,你的SQL查詢樣子:

 
select * from wt_lists where id IN ('1,2') from wt_stats where statsid IN (1) 

要使用IN子句,您需要選擇不同的值在不同的行中。

我發現這個存儲過程完全符合你的需求。

http://kedar.nitty-witty.com/blog/mysql-stored-procedure-split-delimited-string-into-rows/

我沒有測試過,但事情是這樣的。 Obs:就像David在上面的評論中所說的那樣,解析應用程序中的數據是更好的方法。