一次从关系数据库中检索列

时间:2013-12-23 21:50:30

标签: mysql sql relational-database

为了简化问题,我们假设这是针对学校数据库的,我们有3个表。在这所学校,学生可以参加多个课程,这些课程有多个课程,我们在数据库中存储有关可用课程,每门课程以及学生目前正在学习的课程和课程的信息。

courses有两列,cs_idcs_name。表格lessons有3列ls_course,其中存储了课程来自的课程ID ls_number - 标识课程中课程的序号 - ls_name 。最后一个表students存储学生ID,st_id,课程ID以及该课程中的当前课程st_coursest_lesson。一些样本数据:

courses
+-------+----------+
| cs_id | cs_name  |
+-------+----------+
|     1 | Course A |
|     2 | Course B |
+-------+----------+

lessons
+-----------+-----------+--------------+
| ls_course | ls_number | ls_name      |
+-----------+-----------+--------------+
|         1 |         1 | Lesson One   |
|         1 |         2 | Lesson Two   |
|         1 |         3 | Lesson Three |
|         2 |         1 | Lesson One   |
|         2 |         2 | Lesson Two   |
|         2 |         3 | Lesson Three |
+-----------+-----------+--------------+

students
+-------+-----------+-----------+
| st_id | st_course | st_lesson |
+-------+-----------+-----------+
|     1 |         1 |         2 |
|     2 |         1 |         3 |
|     2 |         2 |         2 |
+-------+-----------+-----------+

正如您所看到的,我们目前有2名学生,而ID为2的学生目前正在参加2门课程。在课程A中,她在第三课,在课程B中,在第二课。我想要的是检索一个学生目前所在课程的列表。但不是:

SELECT * FROM students WHERE st_id = 2;

这将返回已过滤的行,但我想为它们检索课程和课程ID 名称。要获得课程名称列,我会这样做:

SELECT s.*, c.cs_name
FROM students s, courses c
WHERE s.st_id = 2 AND s.st_course = c.cs_id

结果是:

+-------+-----------+-----------+----------+
| st_id | st_course | st_lesson | cs_name  |
+-------+-----------+-----------+----------+
|     2 |         1 |         3 | Course A |
|     2 |         2 |         2 | Course B |
+-------+-----------+-----------+----------+

我能得到的是:

SELECT s.*, c.cs_name, l.ls_name
FROM students s, courses c, lessons l
WHERE 
    s.st_id = 2            AND
    s.st_course = c.cs_id  AND
    s.st_lesson = l.ls_number

但是如何检索课程ID和章节以检查课程表中的匹配,是否可以?我想要的结果是:

+-------+-----------+-----------+----------+--------------+
| st_id | st_course | st_lesson | cs_name  | ls_name      |
+-------+-----------+-----------+----------+--------------+
|     2 |         1 |         3 | Course A | Lesson Three |
|     2 |         2 |         2 | Course B | Lesson Two   |
+-------+-----------+-----------+----------+--------------+

1 个答案:

答案 0 :(得分:2)

此查询错误:

 SELECT s.*, c.cs_name, l.ls_name
    FROM students s, courses c, lessons l
    WHERE 
        s.st_id = 2            AND
        s.st_course = c.cs_id  AND
        s.st_lesson = l.ls_number

您还需要将 st_course ls_course 匹配

 SELECT s.*, c.cs_name, l.ls_name
    FROM students s, courses c, lessons l
    WHERE 
        s.st_id = 2            AND
        s.st_course = c.cs_id  AND
        (s.st_lesson = l.ls_number AND st.st_course=l.ls_course)

我还建议使用当前的JOIN语法,即

SELECT s.*, c.cs_name, l.ls_name
FROM students s 
JOIN courses c ON c.cs_id=s.st_course
JOIN lessons l ON (s.st_lesson=l.ls_number AND st.st_course=l.ls_course)
WHERE s.st_id = 2