2013-12-23 23 views
0

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

courses有2列,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 | 
+-------+-----------+-----------+----------+--------------+ 
+0

关于课程名称,它们与本示例中的每门课程并不完全相同。这只是我想要做的简单化。 – sidyll

回答

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_coursels_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    
+0

谢谢。是的,这是不正确的,我只是把它写成最接近我想要的。你的是完美的。并感谢'JOIN'替代品,这是我没有想到的。 – sidyll

+1

我想你会发现JOIN语法更具可读性。很高兴它正在工作 – Sparky