3

この質問が少し漠然としている場合は、お知らせください。詳細情報を提供します。

複数のテーブルからデータを取得するクエリを作成しましたが、期待どおりに機能せず、完全に困惑しています。

これが私のコードです:

SELECT students.student_fname, students.student_lname
FROM  students, enrolments
WHERE enrolments.courseID = 'C001';

しかし、これは学生テーブル内のすべての学生の姓名を返すだけで、これらの名前は 2 回表示されます。

2 つのテーブルのコードは次のとおりです。

CREATE TABLE students
(
studentID CHAR(10) NOT NULL,
student_fname VARCHAR(15) NOT NULL,
student_lname VARCHAR(15) NOT NULL,
DOB VARCHAR(10) NOT NULL,
CONSTRAINT pk_students PRIMARY KEY (studentID)
);

CREATE TABLE enrolments
(
enrolmentNo int NOT NULL AUTO_INCREMENT,
studentID CHAR(10) NOT NULL,
courseID CHAR(4) NOT NULL,
CONSTRAINT pk_enrolments PRIMARY KEY (enrolmentno),
FOREIGN KEY (studentID) REFERENCES students (studentID),
FOREIGN KEY (courseID) REFERENCES courses (courseID)
)ENGINE = INNODB;
4

2 に答える 2

3

これは、学生が登録にどのように関係するかを定義していないためです。

内部結合を使用するか、それらがどのように関連しているかを示す where 句を追加する必要があります。

例えば:

FROM Students
INNER JOIN enrolments on Students.ID = enrolments.studentID

または

FROM students, enrolements 
WHERE enrolments.studentID = students.ID

最初の方法はより新しく、多くの人に好まれています。ただし、従来の方法もサポートされています。

テーブル結合の理解を深めるには、この最も優れた記事をご覧ください: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

そうしないと、すべてのデータがすべてのデータに関連する 2 つのテーブルのデカルト積と呼ばれるものが得られます。

登録に一意のインデックスがない場合 (学生は 1 クラスの登録のみを持つことができます)、select Distinct field namesorwhere... group by fieldsも結果を探しているものに近いものに制限します。

============================ フォローアップコメントに応じて=============== ====

SELECT S.student_fname, S.student_lname 
FROM students S 
INNER JOIN enrolments  E
  ON S.StudentID = E.StudentID
WHERE e.courseID = 'C001'
GROUP BY S.Student_Fname, S.Student_lname
ORDER BY S.Student_LName, S.Student_FName

group by は、同じコースの重複を排除します。"ONステートメントは、学生が登録にどのように関係しているかをデータベースに伝えます.order byは、結果に合理的な順序を提供するためのものです.

于 2013-04-09T01:22:07.990 に答える
0

この方法では、2 つのテーブルからデータをフェッチすることはできません。テーブルを結合する必要があります。

于 2013-04-09T01:22:03.743 に答える