Вы в настоящее время делаете внутреннее соединение. Ваш запрос эквивалентен написанию:
SELECT social.withID, accounts.username
FROM social INNER JOIN accounts ON (social.withID = accounts.id)
WHERE social.id = ? AND friendAccept = 1
Разница между вашим запросом и тем, что вы получите, если переключитесь на левое внешнее объединение, состоит в том, что происходит, если запись не существует в правой таблице. При внутреннем объединении, если запись не существует в учетных записях (в соответствии с условием ON, например, не удается найти учетную запись с таким идентификатором), строка не будет возвращена. При левом внешнем соединении вместо него будут возвращаться нули.
Я не знаю вашу схему, но подозреваю, что соединение (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). Если вы измените его на левое соединение, то они будут отображаться в выводе как имеющие нулевых друзей. [Этот запрос может игнорировать принятый статус и т. Д.… Еще раз, я не знаю вашу схему]