Есть ли лучший способ сделать это MySQL присоединиться? - PullRequest
0 голосов
/ 09 ноября 2011

Вот запрос,

$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']));

Он в основном вытаскивает имя пользователя из таблицы учетных записей и добавляет его в таблицу друзей, где они являются принятыми друзьями. Я новичок в объединениях и не знаю, стоит ли мне использовать это левое (я думаю) объединение или другое?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2011

Вы в настоящее время делаете внутреннее соединение. Ваш запрос эквивалентен написанию:

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). Если вы измените его на левое соединение, то они будут отображаться в выводе как имеющие нулевых друзей. [Этот запрос может игнорировать принятый статус и т. Д.… Еще раз, я не знаю вашу схему]

0 голосов
/ 09 ноября 2011

Да, явно показать объединение:

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

0 голосов
/ 09 ноября 2011

Выглядит нормально для меня.

Использование запятой эквивалентно INNER JOIN, кстати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...