所以我相信我需要一个内部联接来进行此查询,但我并非100%肯定。
首先查看我的数据库图表:
Click here for database diagram
我想要实现的目标:
在哪里? =一个输入的用户名
到目前为止我尝试了什么
我尝试了很多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;";
我现在认为我需要使用内部联接来实现我想要的,但我不太确定这是否正确,或者如何去做。
提前致谢。
答案 0 :(得分:2)
尝试类似:
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是许多数据库的保留字,最好避免使用命名字段。
答案 1 :(得分:-1)
一个简单的子查询应该这样做:
select * from messages where user_username in
(
select followed_username from user_follows
where follower_username = 'your_input_username'
);