2012-08-07 78 views
1

我有两个表课程&学生MySQL的地方,在子查询只返回一行

说,学生有字段: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预期

而且

​​

按预期得到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);

产生安德鲁,布莱恩·埃里克

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

我深知,我可能/应该有一个单独course_student查表,但我急于了解为什么我没有得到我期待的结果

我在哪里出错了?

回答

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描述。

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

+0

它的工作原理! SELECT @students:= students FROM courses c WHERE c.id = 1; SELECT s.first_name FROM students s WHERE FIND_IN_SET('id',@students)\ n谢谢你的答案。我认为这肯定是一个类型问题,我试图把学生作为Char,但似乎没有工作 – apwatts 2012-08-07 13:57:02

+0

我现在成功地使用..... SELECT s.first_name FROM students s WHERE FIND_IN_SET('id',(SELECT students FROM courses c WHERE c.id = 1)) – apwatts 2012-08-07 14:01:49

0

你需要加入两个表:preferablly使用INNER JOIN

StudentsCourse,试试这个:

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 
+0

可悲只获得第一个名字 – apwatts 2012-08-07 14:03:52