1

我有两张桌子课程和学生

说,学生有领域:idfirst_name 有数据

id : first_name

1 : Andrew
2 : Brian
3 : Charles
4 : David
5 : Eric
6 : Fred
7 : George

比如说,Course 有两个字段:id 和 students

有数据:

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; 选择@学生;`

产生 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 查找表,但我很想知道为什么我没有得到我期望的结果

我哪里错了?

4

2 回答 2

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
于 2012-08-07T08:23:14.220 回答
0

您的问题在于您如何使用@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 描述的 INNER JOIN。

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

于 2012-08-07T08:32:04.593 回答