我有一个用户表、一个作业表和一个文件表;确切的表名是 user_table
、jobs
和 files
。
作业表和用户表有一个公共字段,但所有 3 个都没有公共字段。因此,文件表具有等于作业表中id
jobid
,作业表具有userid
等于用户表中的userid
。
示例记录
files table
id name path jobid
-------------------------------------------
7 test.gif uploads/test.gif 130
jobs table
id userid ponumber date
------------------------------------------------
130 1013 2322 10/14/2013 2:55:1pm
user_table table
userid username email fname sname
-------------------------------------------------------
1013 username email@email.com first last
文件 7 属于作业 130,作业 130 属于用户 1013。因此,在页面上显示文件时,我还想显示文件的所有者,但这距离两个表。
我该怎么做?我没有尝试过任何东西,因为我是MySQL编程的新手。如果我尝试猜测一些事情,它可能会像这样:
SELECT *
FROM user_table u
INNER JOIN jobs j USING (userid)
LEFT JOIN files f ON j.id = f.jobid
这可能是一个如此疯狂的猜测,甚至不值得一提。
好吧,如果所有用户都有作业并且所有作业都有文件,或者您只想向用户显示具有具有文件的作业,那么
SELECT *
FROM user_table u
INNER JOIN jobs j ON j.id=u.userID
INNER JOIN files f ON j.id = f.jobid
会这样做。
如果所有用户都没有作业,并且所有作业都没有文件,或者您希望显示所有用户,无论他们是否有文件作业,那么
SELECT *
FROM user_table AS u
LEFT JOIN jobs AS j ON j.id=u.userID
LEFT JOIN files AS f ON j.id = f.jobid
会这样做。
这里提供了联接的描述,可能会帮助您更好地理解联接。
SELECT user_table.username, files.*
FROM files
INNER JOIN jobs ON files.jobid = jobs.id
INNER JOIN user_table ON jobs.userid = user_table.userid
SELECT files.id, files.name, jobs.id, user_table.username
FROM files LEFT JOIN jobs
ON files.id = jobs.id LEFT JOIN user_table
ON jobs.userid = user_table.userid