2012-08-07 81 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