найти «аккаунты», с которыми пользователь еще не подружился - PullRequest
1 голос
/ 03 июля 2011

У меня есть таблица accounts (id, полное_имя) и account_friends (account_id, friend_id).friend_id - это, в основном, идентификатор учетной записи другого пользователя.Как найти все учетные записи, с которыми id = 1 еще не подружился?

В ответ на @OMG Ponies.

В принципе, я понимаю, что для этого потребуется несколько объединений.Моя логика выглядит так:

SELECT
    a2.id
FROM
    accounts a1

/* left/right join a1 with account_friends */

INNER JOIN
    accounts a2
ON
    af1.friend_id = a2.id
WHERE
    a1.id;

Хотя я не понимаю бит левого / правого соединения, который должен помочь найти записи, не являющиеся друзьями.

1 Ответ

0 голосов
/ 03 июля 2011

Это даст вам все идентификаторы и имена учетных записей, в которых идентификатор не равен идентификатору учетной записи = 1, а не является идентификатором друга учетной записи = 1:

SELECT id, full_name
  FROM accounts
 WHERE id NOT IN (SELECT friend_id
                    FROM account_friends
                   WHERE account_id = 1)
   AND id <> 1

Как указано в комментариях antonis_wrx, это вышезапрос будет выполняться только в том случае, если все дружеские отношения для учетной записи хранятся в учетной записи-> друг (т. е. (1,2)), а не в смеси, т. е. (1,2) и (3,1).

Здесьзапрос, который будет работать для второго случая:

SELECT id, full_name
  FROM accounts
 WHERE id NOT IN (SELECT friend_id FROM account_friends WHERE account_id = 1)
   AND id NOT IN (SELECT account_id FROM account_friends WHERE friend_id = 1)
   AND id <> 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...