如何在MYSQL中连接所有三个表?

时间:2016-07-16 15:42:57

标签: php mysql sql select join

我有一个MySQL数据库,其中有三个表格,用于保存用户上传的照片信息。我有一个PHP页面,显示数据库中的所有照片(tbl_uploads)以及上传者(tbl_users)。为了显示照片以及上传的照片,我加入了MySQL查询。

SELECT * 
FROM tbl_uploads, tbl_users
WHERE tbl_uploads.user_id = tbl_users.user_id
ORDER BY date DESC

我现在想要将第三个表tbl_collab加入到MySQL查询中,这样我就可以显示与照片合作的所有用户(表单允许他们发布$file及其$ { {1}}到user_id)。我想我需要使用tbl_collab添加tbl_uploads.file的加入,但我不确定如何。

tbl_collab.user_id

我一直在尝试你的各种建议,我无法让他们按照我希望的方式工作,所以我做了mysql fiddle可能对我有所帮助。 问题是,当我遍历查询在PHP中抛出的行时,我只获取与tbl_users |//**user_id**//|int(11)|No| |user_name|varchar(25)|No| |user_email|varchar(60)|No| |user_password|varchar(255)|No| |joining_date|datetime|No| tbl_uploads |//**id**//|int(10)|No| |file|varchar(100)|No| |type|varchar(30)|No| |size|int(11)|No| |user_id|int(11)|No| |user_name|varchar(25)|No| tbl_collab |//**id**//|int(11)|No| |user_name|varchar(100)|No| |user_id|int(11)|No| |file|varchar(255)|No| 连接的行,或者让多行重复自己。

4 个答案:

答案 0 :(得分:2)

我建议使用ANSI SQL语法进行连接(过度提及“from”子句中的多个表),因为一旦查询变得复杂,我发现ANSI语法更容易理解。使用该语法,连接多个表并不是什么大问题。如,

SELECT uploads.<column>, users.<column>, collabs.<column> 
FROM tbl_uploads uploads
JOIN tbl_users users ON users.user_id=uploads.user_id
JOIN tbl_collabs collabs ON collabs.file=uploads.file
ORDER BY uploads.date DESC

(注意,将上面的<column>替换为您要从相应表中选择的列的名称,使用AS语法在必要时提供唯一的名称。)

如果您希望数据库变大,请考虑您可能希望在连接条件中的字段上创建索引以获得性能。您可能还希望在加入时使用左连接,例如,tbl_collabs如果上传可能没有协作者,否则如果tbl_collabs中没有匹配的行,查询将不返回任何数据。 / p>

答案 1 :(得分:1)

似乎联系已存档给我

  SELECT * 
  FROM tbl_uploads
  inner join tbl_users on  tbl_uploads.user_id = tbl_users.user_id
  inner join tbl_collab  on tbl_collab.file = tbl_uploads.file
  ORDER BY date DESC

答案 2 :(得分:1)

您可以添加其他加入条件。另请注意,隐式连接(在from子句中有多个表)不被视为一种好习惯,您应该使用显式join子句:

SELECT   * 
FROM     tbl_uploads up
JOIN     tbl_users us ON up.user_id = us.user_id
JOIN     tbl_collab c ON c.user_id = up.user_id
ORDER BY date DESC

答案 3 :(得分:1)

要做的第一件事就是规范化您的数据。仔细观察,所有三个表都会显示用户名。它不应该。它只属于users表。那么你的其他表需要有一个user_id字段而不是用户名。

tbl_uploads

|//**id**//|int(10)|No|
|file|varchar(100)|No|
|type|varchar(30)|No|
|size|int(11)|No|
|user_id|int(11)|No|

 tbl_collab

|//**id**//|int(11)|No|
|user_id|int(11)|No|
|file|varchar(255)|No|

在这两种情况下,user_id都是users表中id字段的外键。现在我们有了一致的东西加入。

SELECT * FROM tbl_uploads
  INNER JOIN tbl_users ON tbl_uploads.user_id = tbl_users.user_id
  INNER JOIN tbl_collab ON tbl_collab.file = tbl_uploads.file

您是否应该使用INNER JOIN或LEFT JOIN取决于您对数据的确切要求,但根据提供的信息,INNER JOIN似乎更合适。

更新:正如@drew指出的那样,您的表中没有一个名为date的列您是否打算按tbl_users.joining_date排序?