MySQL,其中子查询中只返回一行
我有两张桌子和两个学生 比如,学生有字段:id,first_name 有数据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
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)