MySQL选择带有替换的子查询

时间:2010-06-26 11:38:53

标签: mysql

所以我的数据格式如:1 ;; 2;然后我需要在查询中使用这个数字,所以我认为我将它转换为1,2并在IN条件下使用它。在我的表中,结果应返回2行,但它只返回1行。

我的查询是这样的。子查询返回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)

我在这里缺少什么?

2 个答案:

答案 0 :(得分: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)

您正在替换字符串:

';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在上面的评论中所说,解析应用程序中的数据是一种更好的方法。