有没有更好的方法来做这个mysql连接?

时间:2011-11-09 18:03:32

标签: mysql join

这是查询,

$q = $dbc -> prepare("SELECT social.withID, accounts.username 
      FROM social, accounts 
      WHERE social.withID = accounts.id AND social.id = ? AND friendAccept = 1");
$q -> execute(array($user['id']));

它基本上从帐户表中提取用户名并将其添加到朋友表中,在那里他们被接受为朋友。我是新手加入,不知道我应该使用这个LEFT(我认为)加入还是其他人?

3 个答案:

答案 0 :(得分:2)

您目前正在进行内部联接。您的查询等同于编写:

SELECT social.withID, accounts.username 
  FROM social INNER JOIN accounts ON (social.withID = accounts.id)
  WHERE social.id = ? AND friendAccept = 1

如果您切换到左外连接,您的查询与您获得的内容之间的区别是,如果右侧表中没有该记录,则会发生这种情况。使用内部联接,如果记录在帐户中不存在(根据ON条件,例如,无法找到具有该ID的帐户),则不会返回任何行。使用左外连接,将返回null。

我不知道您的架构,但我怀疑连接(withID)只能转到存在的帐户,因此帐户中的行将始终存在。但是,让我们考虑一个相关的查询:

SELECT a.account_id, COUNT(s.withID) AS friend_count
   FROM accounts a INNER JOIN social s ON (a.account_id = s.withID)
   GROUP BY a.account_id

如果将其保留为内部联接,则没有任何朋友的人将不会显示在输出中(因为ON条件不匹配)。如果您将其更改为左连接,那么他们将在输出中显示为没有朋友。 [此查询可能会忽略已接受的状态等...再一次,我不知道您的架构]

答案 1 :(得分:0)

对我好看。

您的逗号使用is equivalent to an INNER JOIN,BTW。

答案 2 :(得分:0)

是的,明确显示加入:

SELECT social.withID, accounts.username 
      FROM social inner join accounts on social.withID = accounts.id 
      WHERE social.id = ? AND friendAccept = 1

它不会隐藏您的查询的意图,对于开发人员而言,您的意图更明显,而不是where a.id=b.id