2013-04-15 24 views
23

Tôi muốn chọn dữ liệu từ nhiều bảng hơn với tham gia Nội bộ.Nối bên trong với 3 bảng trong mysql

Đây là các bảng của tôi.

Student (studentId, firstName, lastname) 
Exam (examId, name, date) 
Grade (gradeId, fk_studentId, fk_examId, grade) 

Tôi muốn viết một tuyên bố cho thấy kỳ thi, điểm và ngày nào mà học sinh đã đến. Sắp xếp sau ngày.

Đây là tuyên bố của tôi. Nó chạy, nhưng tôi muốn chắc chắn rằng tôi đang làm nó một cách chính xác.

SELECT 
    student.firstname, 
    student.lastname, 
    exam.name, 
    exam.date, 
    grade.grade 
FROM grade 
    INNER JOIN student 
    ON student.studentId = grade.gradeId 
    INNER JOIN exam 
    ON exam.examId = grade.gradeId 
ORDER BY exam.date 
+0

và sự cố trong đó là gì? –

+1

có vẻ lạ khi cột lớpID được kết nối với studentID? nhưng nếu bạn đặt cấu trúc theo cách đó và nó trả lại kết quả bạn mong đợi thì tôi đoán nó là tốt ... –

+0

Vâng, bạn đang làm điều đó một cách chính xác. Không có nhiều điểm cho câu hỏi mặc dù nếu nó hoạt động và cung cấp cho các kết quả mong đợi phải không? –

Trả lời

48

Gần một cách chính xác .. Nhìn vào tham gia, bạn đang đề cập các lĩnh vực sai

SELECT student.firstname, 
     student.lastname, 
     exam.name, 
     exam.date, 
     grade.grade 
    FROM grade 
INNER JOIN student ON student.studentId = grade.fk_studentId 
INNER JOIN exam ON exam.examId = grade.fk_examId 
ORDER BY exam.date 
+1

20 giây không thành vấn đề :) –

+0

Khi chạy câu lệnh của bạn. Có nội dung Mã lỗi: 1054. các cột không xác định 'grade.fk_studentId' in 'on clause' - – Zincktest

+0

câu trả lời giống như @AjoKoshy đã cho bạn! Nó seams bạn không có một lĩnh vực 'grade.fk_studentId' vì vậy bạn phải sử dụng các lĩnh vực bên phải để thay thế. – agim

10

Các tuyên bố chính xác nên là:

SELECT 
    student.firstname, 
    student.lastname, 
    exam.name, 
    exam.date, 
    grade.grade 
FROM grade 
    INNER JOIN student 
    ON student.studentId = grade.fk_studentId 
    INNER JOIN exam 
    ON exam.examId = grade.fk_examId 
ORDER BY exam.date 

Một bảng được giới thiệu đến khác trên cơ sở của mối quan hệ chính nước ngoài được xác định. Bạn nên tham khảo các id đúng nếu bạn muốn dữ liệu hiển thị như được truy vấn. Vì vậy, bạn nên tham khảo các id của các phím nước ngoài thích hợp trong bảng thay vì chỉ trên id mà không định nghĩa một mối quan hệ đúng đắn

+0

20 giây nhanh hơn :-) Bạn có phiếu bầu của tôi. – agim

+0

@agim tuyệt vời :) –

+0

Khi chạy câu lệnh của bạn. Có phải là mã lỗi: 1054. cột không xác định 'grade.fk_studentId' trong 'on khoản' – Zincktest

2
SELECT 
    student.firstname, 
    student.lastname, 
    exam.name, 
    exam.date, 
    grade.grade 
FROM grade 
INNER JOIN student 
    ON student.studentId = grade.fk_studentId 
INNER JOIN exam 
    ON exam.examId = grade.fk_examId 
GROUP BY grade.gradeId 
ORDER BY exam.date