SQL内部连接有3个表

时间:2016-11-15 17:04:50

标签: mysql sql

所以我相信我需要一个内部联接来进行此查询,但我并非100%肯定。

首先查看我的数据库图表:

Click here for database diagram

我想要实现的目标:

  • 我正在尝试获取user_username与followed_username匹配的所有消息(所以user_username,text,posting_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;";

我现在认为我需要使用内部联接来实现我想要的,但我不太确定这是否正确,或者如何去做。

提前致谢。

2 个答案:

答案 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'
);