MySQL where-in子查询只返回一行

时间:2012-08-07 08:19:20

标签: mysql subquery where-in

我有两个课程和课程学生

说,学生有字段:idfirst_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查找表,但我很想知道为什么我没有得到我期待的结果

我哪里错了?

2 个答案:

答案 0 :(得分:0)

您需要加入两个表:StudentsCourse,最好使用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子句的一个怪癖,它忽略了第一个数字后变量中的所有其他内容。