我有两个表课程&学生
比如说,学生有字段:id,first_name with data
id : first_name
1 : Andrew
2 : Brian
3 : Charles
4 : David
5 : Eric
6 : Fred
7 : George比如说,课程有两个字段: id和学生
使用数据:
id。。。。。。。。1.。。。。。2
学生们。。。1,2,5.。.3,4,6,7
假设我想找到课程1中的学生的名字
SELECT students FROM courses c WHERE c.id = 1;
预期收益率为1,2,5
也是
SELECT @students := students FROM courses c WHERE c.id =1;
预期收益率为1,2,5
和
SELECT s.first_name FROM students s WHERE s.id IN (1,2,5);
收益率安德鲁,布莱恩·埃里克如预期
SET @students := students FROM courses c WHERE c.id =1; SELECT @students;`
产生1,2,5
我期待着
SET @students := students FROM courses c WHERE c.id =1; SELECT s.first_name FROM students s WHERE s.id IN (@students);
为了让安德鲁,布莱恩·埃里克
但它只返回名字: Andrew
我完全知道我可以/应该有一个单独的course_student查找表,但我很想知道为什么我得不到预期的结果
我哪里错了?
发布于 2012-08-07 16:32:05
您的问题在于如何使用@students;当在' 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
)(一个经典的相关子查询)
或者:
SELECT s.first_name FROM students s WHERE FIND_IN_SET(`id`, @students)或者,最好使用,如@JohnTotetWoo所描述的那样使用内部连接。
*它似乎缺省为一个字符串,然后对int的结果强制转换去掉了第一个逗号之后的每个数字。但是,这也可能是IN子句的一个怪癖,它忽略了变量中第一个数字之后的所有其他内容。
发布于 2012-08-07 16:23:14
您需要连接两个表:Students和Course,最好使用INNER JOIN
试试这个:
SELECT b.First_name
FROM Courses a
INNER JOIN Students b
on a.studentID = b.ID
WHERE a.ID = 1它应该会返回
First_Name
==============
Andrew
Brian
Erichttps://stackoverflow.com/questions/11841850
复制相似问题