[英]SQL Inner Join with 3 tables
所以我認為我需要一個內部聯接來進行此查詢,但我不是100%肯定。
首先看我的數據庫圖:
我想要實現的目標:
哪里? =一個輸入的用戶名
到目前為止我嘗試過的
我已經嘗試了許多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.