簡體   English   中英

如何在MYSQL中聯接所有三個表?

[英]How to join all three tables in MYSQL?

我有一個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和$ user_idtbl_collab )。 我想我需要從tbl_uploads.file添加一個帶有tbl_collab.user_id但是我不確定如何。

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|

我一直在嘗試您的各種建議,但實際上並不能如我所願地使它們起作用,所以我做了一個mysql提琴 ,可能會對我有所幫助。 問題是,當我遍歷查詢在PHP中引發的行時,以太只得到tbl_uploads.file and tbl.collab.file所在的行,或者得到多個重復的行。

我建議對聯接使用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中沒有匹配的行,查詢將不返回任何數據。

似乎我的加入已存檔

  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

首先要做的是標准化您的數據。 如果仔細觀察,用戶名將出現在所有三個表中。 不應該這樣 它僅屬於用戶表。 然后,其他表需要有一個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都是用戶表中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進行排序?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM