【问题标题】:Join on specific key not working加入特定密钥不起作用
【发布时间】:2014-12-27 23:08:56
【问题描述】:

我有四个这样的表:

  • 学年(id)
  • 学生(id,schoolyear_id)
  • 测试(id)
  • 成绩(id、test_id、student_id、分数)

学生与schoolyear(通过fk)相关联,成绩与test 和student 通过fk 相关联。

无论如何,我希望返回特定学年的所有学生,并加入该学生的测试 score 以及学生表中的所有其他字段(如果存在)。如果不是,score 字段应该为空。这是我所拥有的:

SELECT *, `student`.`id` as `studentid`
FROM `student`
LEFT JOIN `grade` ON `grade`.`student_id` = `student`.`id` 
WHERE `student`.`schoolyear_id` = ?

我目前的声明中没有任何内容告诉它特定的测试,但这就是我想要的。

【问题讨论】:

  • 你能提供样本数据和期望的结果吗?理解起来有点混乱。
  • @sgeddes 我想要学生表中的每个字段,以及该测试中的 rating 字段。

标签: php mysql sql


【解决方案1】:
SELECT *, `student`.`id` as `studentid`, t.*
FROM `student`
LEFT JOIN `grade` ON `grade`.`student_id` = `student`.`id` 
LEFT JOIN `test` t ON `t`.`id` = `grade`.`test_id` 
WHERE `student`.`schoolyear_id` = ?
and test_id = ?

【讨论】:

  • 有效,但无论是否有分数都不会返回所有学生(我的问题不清楚,所以这是我的错)。
  • 当你说所有学生时,你的意思是所有学年?
  • 不,student 的 fk 是 schoolyear_id,所以我只想要那个学年的学生。
  • 我不确定我是否理解您的问题,因为对我来说,此查询显示特定学年的所有学生,无论他们是否参加考试。同时尝试 select student.*, t.* from...
  • 我仍然只让那些有考试成绩的学生。
【解决方案2】:

只需将条件添加到 ON 子句。这将确保学生保持参与,即使该测试没有成绩。

SELECT g.*, s.id
FROM Student s
LEFT JOIN Grade g
ON g.student_id = s.id
 AND g.id = ?
WHERE s.schoolyear_id  = ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多