Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL,其中子查询中只返回一行_Mysql_Subquery_Where In - Fatal编程技术网

MySQL,其中子查询中只返回一行

MySQL,其中子查询中只返回一行,mysql,subquery,where-in,Mysql,Subquery,Where In,我有两张桌子和两个学生 比如,学生有字段:id,first_name 有数据 id : first_name 1 : Andrew 2 : Brian 3 : Charles 4 : David 5 : Eric 6 : Fred 7 : George 比如说,课程有两个字段:id和学生 关于数据: 身份证。1.二, 学生们。1,2,5. . . .3,4,6,7 假设我想找到课程1中的学生姓名 从课程c中选择学生,其中c.id=1 收益率1,2,5如预期 也 选择@students:=课程

我有两张桌子和两个学生

比如,学生有字段:id,first_name 有数据

id : first_name

1 : Andrew
2 : Brian
3 : Charles
4 : David
5 : Eric
6 : Fred
7 : George
比如说,课程有两个字段:id和学生

关于数据:

身份证。1.二,

学生们。1,2,5. . . .3,4,6,7

假设我想找到课程1中的学生姓名

从课程c中选择学生,其中c.id=1

收益率1,2,5如预期

选择@students:=课程c中的学生,其中c.id=1

收益率1,2,5如预期

从学生s中选择s.first_name,其中s.id在1,2,5中

安德鲁,布莱恩,埃里克,一切如期

设置@students:=课程c的学生,其中c.id=1; 选择@学生`

产量1,2,5

我希望

设置@students:=课程c的学生,其中c.id=1; 从学生s中选择s.first_名称,其中s.id位于@students中

让出安德鲁,布莱恩·埃里克

但它只返回第一个名字:安德鲁

我完全知道我可以/应该有一个单独的课程学生查询表,但我很想了解为什么我没有得到我期望的结果


我哪里出错了?

您需要同时连接两个表:学生表和课程表,最好使用内部连接

试试这个:

SELECT  b.First_name
FROM    Courses a 
            INNER JOIN Students b
                on a.studentID = b.ID
WHERE   a.ID = 1
它应该会回来

First_Name
==============
Andrew
Brian
Eric

你的问题在于如何使用@student;在'in'子句中使用时,它默认为string*

因此,您的查询实际上如下所示:

SELECT s.first_name FROM students s WHERE s.id IN ("1, 2, 5");
不幸的是,结果是:

SELECT s.first_name FROM students s WHERE s.id IN (1);
要么:

SELECT s.first_name 
FROM students s 
WHERE s.id IN (
               SELECT students FROM courses c WHERE c.id =1
               )
一个经典的相关子查询

或:

或者,更优选地,使用@JohnTotetWoo描述的内部联接


*它似乎默认为一个字符串,然后转换为int的结果会去掉第一个逗号后的每个数字。然而,这也可能只是IN子句的一个怪癖,它忽略了变量中第一个数字之后的所有其他内容。

它可以工作!!选择@students:=课程c中的学生,其中c.id=1;从学生s WHERE FIND_IN_SETid中选择s.first_name,@students\n谢谢你的回答。我认为这一定是类型问题,我曾尝试将学生强制转换为Char,但这似乎不起作用。我现在已成功使用…。从学生s WHERE FIND_IN_SETid中选择s.first_name,从课程c中选择学生,其中c.id=1仅获得名字
SELECT s.first_name FROM students s WHERE FIND_IN_SET(`id`, @students)