多个SQL JOIN语句

时间:2013-05-10 15:26:16

标签: mysql inner-join

我必须从两个表中进行查询,所以例如这里是“student”表的表结构:

-------------------------------------------
id  |  Name  |  mom_job_id  |  dad_job_id
-------------------------------------------
1   | Test1  | 1            |  2
2   | Test2  | 3            |  1
-------------------------------------------

我有这样的“工作”表:

---------------------------
id  | job_name
---------------------------
1   | designer
2   | writer
3   | programmer
---------------------------

我想在学生表上选择一条记录,并将“mom_job_id”和“dad_job_id”替换为“工作表”上的job_name

我试过这个问题:

SELECT student.id, job.job_name as mom_job, job.job_name as dad_job
FROM student
INNER JOIN job ON mom_job_id = job.id
WHERE id=1

该查询工作正常,但是爸爸的工作设置与妈妈的工作相同,所以我添加另一个INNER JOIN并进行如下查询:

SELECT student.id, job.job_name as mom_job, job.job_name as dad_job
FROM student
INNER JOIN job ON mom_job_id = job.id
INNER JOIN job ON dad_job_id = job.id
WHERE id=1

查询有效,但未返回任何记录。那么我该如何解决这个问题呢?我相信这个问题来自于job.id

2 个答案:

答案 0 :(得分:2)

您需要为工作表添加别名,因为您已经两次引用它。

使用LEFT OUTER JOIN将始终为学生表中的每个匹配记录拉一行。如果妈妈或爸爸的作业表中没有匹配的记录,那么该列将返回NULL值。

SELECT s.id, mom.job_name as mom_job, dad.job_name as dad_job
FROM student s
  LEFT OUTER JOIN job mom ON s.mom_job_id = mom.id
  LEFT OUTER JOIN job dad ON s.dad_job_id = dad.id
WHERE s.id = 1

答案 1 :(得分:2)

你很接近这个,只需在每次加入时给作业表一个不同的别名。

SELECT s.id, job_mom.job_name as mom_job, job_dad.job_name as dad_job
FROM student s
INNER JOIN job job_mom ON s.mom_job_id = job_mom.id
INNER JOIN job job_dad ON s.dad_job_id = job_dad.id
WHERE s.id=1

如果作业表JOIN没有返回一行而您仍想显示学生表数据,则可以使用LEFT JOIN:

SELECT s.id, job_mom.job_name as mom_job, job_dad.job_name as dad_job
FROM student s
LEFT JOIN job job_mom ON s.mom_job_id = job_mom.id
LEFT JOIN job job_dad ON s.dad_job_id = job_dad.id
WHERE s.id=1