2016-11-15 98 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