这是查询,
$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(我认为)加入还是其他人?
答案 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