我必须从两个表中进行查询,所以例如这里是“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
答案 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