mysql中in嵌套select只能查询出一个结果

使用SELECT knowledge FROM `fk_lesson` WHERE lessonname='离散数学'的查询结果是:19,20,21,22,23,24,25,26,27
将结果带入SELECT * FROM `fk_knowledge` WHERE id in (19,20,21,22,23,24,25,26,27);
可以正确的查出
但是如果
SELECT * FROM `fk_knowledge` WHERE id in (SELECT knowledge FROM `fk_lesson` WHERE lessonname='离散数学');
将两句合成一句,这样就只能查出IN里边第一个结果的值。。这是为什么呢?求解

没见过这么不严谨的写法……
好吧,你每次执行WHERE id in (SELECT knowledge……)里面的数据的时候,括号里面都要执行一次。
可能就是因为这个原因导致的错误。具体不明。追问

对呀,,就是要每次查询的时候,括号里边的要执行啊。。。求纠正

追答

可能……或许。如果括号内是一个变量,可能会遍历一遍。(这次第一个下次第二个)
如果是个函数,那么执行以后先审核第一个,然后下次又是第一个。(因为查询出来的总会被认为是新的。)

追问

那应该怎么修改呢

追答

把括号内查询赋值给一个数组变量。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-26

这时一个很简单的子查询应用. 是可以这样写的.

这种子查询效率 要比 from a,b  这种效率高很多.

楼主一定是在某步搞错了, 我刚在本地执行了一下. 也是可以的

不知道楼主是不是在命令行里执行的.

如果是程序执行的,最好在命令行里执行一遍.

人格担保,楼主这种sql是没问题的.

见下图

追问

其实我的里边那个数据是都保存到一个字段了,没有一每条记录的形式保存

追答

呵呵, 这种是肯定不行的.
对于mysql来说
他不知道你的子查询出来了多少条结果,子查询有多少条记录,外围的in里 mysql就会去判断几次
select * from table where id in(1,2,3);
对于这条sql
mysql会转换为3条sql, 分别为 where id=1; where id=2; where id=3
所以你的sql 最终被解释成了
SELECT * FROM `fk_knowledge` WHERE id '19,20,21,22,23,24,25,26,27';
所以只能出来一条结果.

本回答被提问者和网友采纳
第2个回答  2013-09-26
貌似不可能吧追问

哈哈,千真万确~。。。尝试过很多次

追答

你把这句话放你数据库里先执行in后面的语句,结果是多条?

追问

必须是啊