1

我必须从两个表中进行查询,例如,这是我的“学生”表的表结构:

-------------------------------------------
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”

我试过这个查询:

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

4

2 回答 2

2

您需要为您的工作表起别名,因为您要引用它两次。

使用 aLEFT 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
于 2013-05-10T15:29:20.193 回答
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
于 2013-05-10T15:29:47.713 回答