SELECT * FROM A where A.bigclass in(select arrchild from B) 这样子为什么查不到数据,但是写成
SELECT * FROM A where A.bigclass in(1,2,35,5) 这样子就可以。
注:select arrchild from B 的查询结果是一条记录内容是一字符串(1,2,35,5)
解决方案及解析:
方案一:(转载)
select arrchild from B 的查询结果是一条记录内容是一字符串(1,2,35,5)
这种情况下,
执行
SELECT * FROM A where A.bigclass in(select arrchild from B)
相当于执行
SELECT * FROM A where A.bigclass in( '1,2,35,5' )
结果肯定是没有。
假如你的
select arrchild from B 的查询结果是
1
2
35
4
这样的 4 行数据。
那么
SELECT * FROM A where A.bigclass in(select arrchild from B)
就等价于
SELECT * FROM A where A.bigclass in(1,2,35,5)
如果
select arrchild from B 的查询结果是一条记录内容是一字符串(1,2,35,5)
又要实现
SELECT * FROM A where A.bigclass in(1,2,35,5) 的效果。
一个变通的办法是:
SELECT * FROM A
where
INSTR ( CONCAT ( ',' , (select arrchild from B) , ',' ),
CONCAT (',' , A.bigclass , ',' ) ) > 0
方案二:(原创)
将select arrchild from B 的查询结果 存入到一个数组中比如存到 $result
再将$result数组用逗号分割出来
$ arr = implode(',' , $result);
然后执行要查询的语句:
$sql = 'SELECT * FROM A where A.bigclass in(' . $arr . ')';
就可以查询了。原理和方案一的一个道理