1

私は2つのテーブルコースと学生を持っています

たとえば、学生にはフィールドがあります: idfirst_name データ付き

id : first_name

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

たとえば、コースにはidと学生の2つのフィールドがあります

データあり:

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);

予想通り、Andrew、Brian Eric が生成されます

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);

アンドリュー、ブライアン・エリックを産む

ただし、最初の名前のみが返されます: アンドリュー

別の 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 に答える