MySQL选择与子查询有替换
问题描述:
所以我有一个格式数据像; 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)
我在这里错过了什么?
答
逗号分隔的字符串需要在查询中明确定义才能在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;;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在上面的评论中所说的那样,解析应用程序中的数据是更好的方法。
你的子查询返回一个字符串“1,2”,而不是两行编号1和2 ......当你选择CAST(” 1,2'AS UNSIGNED),你会得到1 – simendsjo 2010-06-26 11:54:37
如果可能的话,我建议解析应用程序逻辑中的数据并发送一个干净的逗号分隔的字符串给MySQL – 2010-06-26 12:01:09
我同意David的观点。从MySQL执行此操作似乎很麻烦。我发现这个存储过程:http://forge.mysql.com/tools/tool.php?id=4 – simendsjo 2010-06-26 12:09:06