我有两个课程和课程学生
说,学生有字段:id
,first_name
与数据
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;
选择@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,Brian Eric
但它只返回名字:Andrew
我完全清楚我可以/应该有一个单独的course_student查找表,但我很想知道为什么我没有得到我期待的结果
我哪里错了?
答案 0 :(得分:0)
您需要加入两个表: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
Eric
答案 1 :(得分:0)
你的问题在于你如何使用@students;当在'IN'子句中使用时,它默认为字符串*。
所以你的查询实际上是这样的:
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描述的INNER JOIN。
*它似乎是默认为一个字符串,然后在第一个逗号后,结果转换为int剥离每个数字。但是,它也可能只是IN子句的一个怪癖,它忽略了第一个数字后变量中的所有其他内容。