2013-10-13 136 views
1

我仍然是数据库和MySQL的新手,我想学习如何使用JOINs。我很抱歉,我不知道这个案件的话。我希望你们所有人都能通过查看这些数据来理解。下面是与记录表:选择基于其他表的数据

student_name | semester | subject_id | comp_id | mark 
------------------------------------------------------- 
Connor  1   24   1   9 
Connor  null  24   2   null 
Connor  null  24   3   null   

有任何人能帮助我:

Table student 
student_id | student_name 
------------------------- 
1   Ana 
2   Billy 
3   Connor 

Table comp 
comp_id | subj_id | comp_name 
-------------------------- 
1   24   Run  
2   24   Swim  
3   24   Jump 
4   25   Eat  

Table comp_mark 
semester | subj_id | student_id | comp_id | mark 
------------------------------------------------- 
1   24  1   1   7 
1   24  1   2   4 
1   24  1   3   6 
1   24  2   1   4 
1   24  2   2   8 
1   24  3   1   9 

我从查询中选择comp_mark表(更新)预期的结果是这样的?感谢一吨

它由student_name UPDATE

我已经试过这(纪尧姆Poussel的查询)和ORDER:

SELECT s.student_name, cm.semester, c.subj_id AS subject_id, c.comp_id, cm.mark 
FROM student s 
CROSS JOIN comp c 
LEFT JOIN comp_mark cm ON s.student_id = cm.student_id 
AND cm.subj_id = c.subj_id 
AND cm.comp_id = c.comp_id 
ORDER BY s.student_name 

结果: enter image description here

+0

向我们展示你到目前为止尝试了什么? – thebjorn

+0

'和cm.semester ='1' AND cm.subj_id ='1''semester和subj_id不是字符列,而是INTEGER。你应该将它们与int值进行比较,如'AND cm.semester = 1 AND cm.subj_id = 1'(我知道mysql会自动执行此类型转换,但这也应该被认为是一个严重的缺陷) – wildplasser

+0

要过滤掉不需要,只需添加一个WHERE子句。例如,'WHERE cmm.subj_id = 24 AND cm.student_id = 4' –

回答

1

试试这个:

SELECT s.student_name, cm.semester, c.subj_id AS subject_id, c.comp_id, cm.mark 
FROM student s 
CROSS JOIN comp c 
LEFT JOIN comp_mark cm ON s.student_id = cm.student_id AND cm.subj_id = c.subj_id AND cm.comp_id = c.comp_id 
0

认为您需要添加一个跨乔从comp中获得所有可能的值。类似这样的: -

SELECT s.student_name, c.subj_id, s.student_id, c.comp_id, cm.mark 
FROM student s 
CROSS JOIN comp c 
LEFT OUTER JOIN comp_mark cm 
ON s.student_id = cm.student_id 
AND cm.semester = '1' 
AND cm.subj_id = '1'