2016-11-15 142 views
4

因此,我相信我需要一個內部加入此查詢,但我不是100%肯定。SQL內部連接3臺

首先看到我的數據庫圖表:

Click here for database diagram

我想要實現:

  • 我試圖讓所有消息(這樣user_username ,text,posted_at FROM Messages),其中user_username與followed_username匹配,以及followed_username具有=?的follower_username。
  • 基本上,每個人都跟着?,我想要得到他們所有的信息。

在哪裏? =的inputed用戶名

我到目前爲止已經

我已經嘗試了多個SQL語句,並迄今無法獲得成功的嘗試。這些都是我嘗試過的。

$sql = "SELECT user_username, text, posted_at FROM Messages, Users, User_Follows WHERE user_username = (SELECT username FROM Users WHERE username = (SELECT followed_username FROM User_Follows WHERE follower_username = ?)) ORDER BY posted_at DESC;"; 
$sql = "SELECT user_username, text, posted_at FROM Messages, User_Follows WHERE follower_username = ? AND followed_username = user_username;"; 
$sql = "SELECT user_username, text, posted_at FROM Messages JOIN User_Follows ON user_username = followed_username WHERE follower_username = followed_username;"; 

我想現在我需要使用一個內連接來達到我想要的,但我不太清楚這是否是正確的,或者如何去了解它。

在此先感謝。

+1

你現在所擁有的是什麼交叉連接這是你的問題。在任何情況下你都不應該使用隱式連接。他們是一種很差的技術,會導致這樣的問題。爲了提供修復,我們需要查看錶結構。 – HLGEM

+3

你看過我的鏈接@HLGEM – jsmith

回答

2

嘗試是這樣的:在使用的LONG VARCHAR或nvarchar領域未來的設計

SELECT M.user_username, M.text, M.posted_at 
FROM Messages M 
INNER JOIN Users U on M.user_username= u.username 
INNER JOIN User_Follows UF on UF.followed_username = u.username 
WHERE UFfollower_username = ? 
ORDER BY posted_at DESC; 

注是一個字段一個糟糕的選擇,你將加入。此外,如果該字段是字符類型字段,則通常會隨着時間改變,這對於關鍵字段也是不好的選擇。

整數加入一般要快得多。如果它可以讓你不必進行一些連接,但總的來說這是一個糟糕的主意,那可能會很好。

如果有人改變了他的用戶名(它在每一個我曾經工作過的系統發生),你將不得不更新所有這可能是相當多的記錄更新子表。如果您使用代理鍵,則只需更新父表。

此外字文是許多數據庫保留字,最好是避開那些在命名字段。

+2

謝謝,很好的回答 – jsmith

-1

一個簡單的子查詢應該這樣做:

select * from messages where user_username in 
(
    select followed_username from user_follows 
    where follower_username = 'your_input_username' 
); 
+1

我會upvote這是你刪除了SQL反模式的select * – HLGEM

+2

@edlerd給出一個錯誤:你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'IN(SELECT followed_username FROM User_Follows WHERE follower_username ='kris'')附近使用正確的語法' – jsmith