为了简化问题,我们假设这是针对学校数据库的,我们有3个表。在这所学校,学生可以参加多个课程,这些课程有多个课程,我们在数据库中存储有关可用课程,每门课程以及学生目前正在学习的课程和课程的信息。
表courses
有两列,cs_id
和cs_name
。表格lessons
有3列ls_course
,其中存储了课程来自的课程ID ls_number
- 标识课程中课程的序号 - ls_name
。最后一个表students
存储学生ID,st_id
,课程ID以及该课程中的当前课程st_course
和st_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 |
+-------+-----------+-----------+----------+--------------+
答案 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