簡體   English   中英

SQL內部連接有3個表

[英]SQL Inner Join with 3 tables

所以我認為我需要一個內部聯接來進行此查詢,但我不是100%肯定。

首先看我的數據庫圖:

單擊此處查看數據庫圖表

我想要實現的目標:

  • 我正在嘗試獲取user_username與followed_username匹配的所有消息(所以user_username,text,posted_at FROM Messages),以及follow_username的follower_username =?。
  • 基本上,每個人都跟着?,我想得到他們所有的信息。

哪里? =一個輸入的用戶名

到目前為止我嘗試過的

我已經嘗試了許多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;";

我現在認為我需要使用內連接來實現我想要的,但我不太確定這是否正確,或者如何去做。

提前致謝。

嘗試類似的東西:

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;

請注意,對於將要加入的字段,使用long varchar或nvarchar字段的未來設計是一個糟糕的選擇。 此外,如果字段是字符類型字段,則它經常會隨着時間而改變,這對於關鍵字段也是不好的選擇。

整數連接通常要快得多。 它可能沒問題,如果它可以讓你不必去做一些連接,但總的來說這是一個糟糕的主意。

如果有人改變了他的用戶名(這確實發生在我曾經工作過的每個系統中),那么你必須更新所有子表,這些表可能需要更新很多記錄。 如果您使用了代理鍵,則只需要更新父表。

此外,單詞text是許多數據庫的保留字,最好避免命名字段中的那些。

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

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

暫無
暫無

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

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