我创建了一个(复杂的)子查询,我将结果放在一个变量中:
@mylist := (select .... )
返回的值是逗号分隔的字符串。因为在子查询中我也使用concat(),值是一个字符串。
在同一个SQL中,我想在另一个子查询中使用此变量,如:
where table.mycolumn IN (@mylist)
问题是因为@mylist是一个字符串,Mysql将查询读取为:
where table.mycolumn IN('575030,655156,655157')
虽然我希望它以
执行where table.mycolumn IN(575030,655156,655157)
如何将字符串转换为(数字)数组?
PS:我正在使用mysql 5.1
答案 0 :(得分:3)
您可以在您指定的mysql版本中使用函数FIND_IN_SET
(it is available)。它使用逗号作为分隔符拆分提供的字符串(在您的情况下存储在变量中),并返回指定值的第一次出现的索引的索引(如果未找到,则返回0
)
/* building the list */
> SELECT @mylist :=GROUP_CONCAT(id SEPARATOR ',') FROM users WHERE id < 10;
+-----------------------------------------+
| @mylist:=group_concat(id separator ',') |
+-----------------------------------------+
| 0,2,3,4,5,6,7,8,9 |
+-----------------------------------------+
> SELECT id, mail FROM users WHERE FIND_IN_SET(id, @mylist);
自动投射足以在大多数情况下自动管理原始类型与最终字符串之间的比较。
<强>更新强>
虽然它可以回答您的问题,但在寻找大量ID时,建议的解决方案可能会变慢。更好的解决方案是放弃使用变量并将结果存储在临时表中
CREATE [TEMPORARY] TABLE IF NOT EXISTS tmp_users (
"id" INT,
PRIMARY KEY (id)
)
INSERT INTO tmp_users (...);