Группировка результатов SQL из объединения - PullRequest
3 голосов
/ 17 мая 2011

Привет, ребята. В моей базе данных есть таблица, используемая пользователями для отслеживания друг друга.

Таблица выглядит следующим образом: UniqueID FollowerID FollowedUserID

FollowID - это идентификатор пользователя, которыйследует за кем-то еще

FollowedUserID - это идентификатор пользователя, за которым следует пользователь FollowID

Я хочу получить список соединений из этой таблицы на основе одного пользователя.Мой запрос должен вернуть все другие идентификаторы пользователя, которые текущий пользователь либо следит, либо за ним следует без наложений.

Итак, у нас есть несколько записей:

FollowerID   FollowedUserID
    1              2
    1              3
    4              1
    2              1

Это показывает, что пользователь 1 следует за пользователями 2 и 3, и, таким образом, за пользователями 2 и 3 следует пользователь 1 .На другой стороне спектра видно, что за Пользователем 1 следуют пользователи 2 и 3.

Что я хотел бы сделать, это выяснить соединения, которые пользователь 1 имеет, поэтому запрос должен возвращать пользователей: 2, 3 и 4 (пользователь 1 следит за пользователями 2 и 3 и сопровождается пользователем 4)

Как я могудобиться этого из одного запроса?

Соединение считается либо выполненным, либо подписанным на кого-то другого, поэтому возможно, что будут получены некоторые дублирующие результаты (если оба пользователя следуют друг за другом).Я хотел бы иметь возможность сгруппировать эти результаты так, чтобы результат был разным.

Я пробовал запрос UNION, подобный следующему:

SELECT FollowerID, FollowedUserID From Follows WHERE FollowerID = 1
UNION
SELECT FollowerID, FollowedUserID FROM Follows WHERE FollowedUserID = 1

Теоретически я хотел бы сгруппироватьFollowerID и FollowedUserID вместе, чтобы их отличать друг от друга.

Меня не интересует получение непонятного результата, а затем создание набора данных с уникальными результатами на стороне php - запрос должен возвращать только разные значения.

Ответы [ 2 ]

8 голосов
/ 17 мая 2011

Вы были близки, но вы должны изменить порядок столбцов в одной из ветвей СОЮЗА:

SELECT FollowerID AS reference_user, FollowedUserID AS connection
  FROM Follows
 WHERE FollowerID = 1
UNION
SELECT FollowedUserID AS reference_user, FollowerID AS connection
  FROM Follows
 WHERE FollowedUserID = 1
GROUP BY reference_user;

Обратите внимание, что если вы отбросите предложения WHERE, вы получите все соединения для всех.

2 голосов
/ 17 мая 2011

Я думаю, вам нужно пересмотреть ваш запрос:

edit: removed the un-needed select distinct
SELECT FollowedUserID as ID From Follows WHERE FollowerID = 1
UNION
SELECT FollowerID as ID FROM Follows WHERE FollowedUserID = 1

Но это не совсем отвечает на вопрос о направлении.

SELECT FollowedUserID as ID, "follow" as direction 
From Follows 
WHERE FollowerID = 1
UNION
SELECT FollowerID as ID, "followed" as direction 
FROM Follows 
WHERE FollowedUserID = 1

Теперь вы знаете направлениесоединение также.

...