Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在MYSQL中连接所有三个表?_Php_Mysql_Sql_Select_Join - Fatal编程技术网

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

Php 如何在MYSQL中连接所有三个表?,php,mysql,sql,select,join,Php,Mysql,Sql,Select,Join,我有一个MySQL数据库,它有三个表,保存用户上传照片的信息。我有一个PHP页面,显示数据库中的所有照片(tbl_上传)以及上传者(tbl_用户)。为了显示照片以及上传照片的人,我加入了MySQL查询 SELECT * FROM tbl_uploads, tbl_users WHERE tbl_uploads.user_id = tbl_users.user_id ORDER BY date DESC 现在我想将第三个表tbl\u collab加入MySQL查询,该查询允许我显示与照片协作的

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

SELECT * 
FROM tbl_uploads, tbl_users
WHERE tbl_uploads.user_id = tbl_users.user_id
ORDER BY date DESC
现在我想将第三个表
tbl\u collab
加入MySQL查询,该查询允许我显示与照片协作的所有用户(一个表单允许他们将
$file
及其$
用户id
发布到
tbl\u collab
)。我想我需要使用
tbl\u collab.user\u id
tbl\u uploads.file
添加一个连接,但我不确定如何添加

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|
我一直在尝试你的各种建议,但我真的无法让它们像我希望的那样发挥作用,所以我提出了一个可能对我有帮助的建议。
问题是,当我在PHP中循环查询抛出的行时,我只得到有join的行,其中包含
tbl\u uploads.file和tbl.collab.file
,或者我得到的多行自身重复。

对我来说,join似乎是文件

  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

您只需添加另一个联接条件。另外,请注意隐式联接(在
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

我建议将ANSI SQL语法用于连接(而不是在“from”子句中提及多个表),因为一旦查询变得复杂,我发现ANSI语法更容易遵循。使用这种语法,连接多个表没有什么大不了的。e、 g

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
选择上载、用户、协作。
从tbl_上传
在用户上加入tbl_用户。用户id=上载。用户id
在collabs.file=uploads.file上加入tbl_collabs collabs
按上载顺序订购。日期描述
(注意,将上面的
替换为要从各个表中选择的列的名称,必要时使用
AS
语法提供唯一的名称。)


考虑一下,如果希望数据库变得更大,那么可能需要在连接条件中的字段上创建索引以提高性能。您可能还希望在加入时使用左联接,例如,如果上载可能没有协作者,则使用左联接。否则,如果在
tbl\u协作中没有匹配的行,则查询将不会返回任何数据。如果仔细观察,用户名会出现在所有三个表中。不应该。它只属于用户表。然后,您的其他表需要有一个user\u 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\u id
都是用户表中
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
您应该使用内部联接还是左联接取决于您需要对数据执行什么操作,但根据提供的信息,内部联接似乎更合适


更新:正如@drew指出的,您的表中没有一个列名为
日期
您可能打算按
tbl\u用户进行排序。连接日期

使用显式连接语法(Join/on),而不是在from子句中用逗号分隔表名。在工作面试/代码审查中看起来不会那么热。原因很多。一种是公共列名。需要说明的是,这里只有您拥有多个表中的select列列表和列名称conflict@Drew同意。。。我正在寻找与用户原始查询相同的内容,但没有看到tbl_协作与tbl_用户之间的冲突。干得好。没有理由因为我而毁掉你的答案。这是我的支持。欢迎来到堆栈。谢谢。很长时间的潜伏者,但现在开始贡献的时间已经过去了。:-)谢谢你所有的答案,真的很有帮助,我正在仔细阅读以准确理解它们。