我有一个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|
连接的行,或者让多行重复自己。
答案 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
排序?