2012-03-05 2 views
0

У меня есть таблица, которая связывает идентификатор пользователя и друга (который является другим пользователем), чтобы сказать, что они друзья. Если Пользователь 1 добавляет пользователя 24 в качестве своего друга, первая строка в таблице ниже будет Если пользователь 10 добавляет пользователя 1 в качестве друга, вторая строка в таблице ниже будетMySQL Table Joins

От там, даже если пользователь 1 находится с обеих сторон, они дружат с соседним ID.

FRIENDS TABLE: 

userID | friendID 
----------------- 
    1 | 24 
    10 | 1 

Что мне нужно сделать сейчас: Если Пользователь 1 авторизован, мне нужно, чтобы показать людям, что они являются друзьями с. Этот запрос я написал:

SELECT DISTINCT (Users.username), friends.userID, friends.friendID FROM Users, friends WHERE Users.userID IN(SELECT userID FROM friends WHERE Users.userID = friends.userID) OR Users.userID IN(SELECT DISTINCT(userID) FROM friends WHERE Users.userID = friends.friendID) 

Принесет назад:

username | userID | friendID 
----------------------------- 
    name1 | 10 | 1 
    name1 | 1 | 24 
    name2 | 10 | 1 
    name2 | 1 | 24 

name1 = ID 1 name2 = ID 10

Есть ли способ, где я могу получить вошедшего пользователя друзей (например, если ID # 1 зарегистрирован), отображаются ли они в столбцах userID или friendID. а затем, в этом случае, извлекать ID 24 и 10, потому что они связаны с ID # 1, а затем, когда дело доходит до отображения, исключить ID # 1 из списка, потому что он поднимет, что они друзья с собой.

Надеюсь, что это имеет смысл и благодарит вас заранее!

ответ

1

Вот простой способ сделать это с помощью UNION. Это также заботится о дубликатах:

(SELECT userID 
FROM friends 
WHERE friendID = 1) 
UNION 
(SELECT friendID 
FROM friends 
WHERE userID = 1) 

Если вы хотите, чтобы вернуть имена тоже, вы можете сделать ваш JOIN и внутри подзапросов:

(SELECT f.userID, u.username 
FROM friends f 
JOIN users u 
    ON u.userID = f.userID 
WHERE f.friendID = 1) 
UNION 
(SELECT f.friendID, u.username 
FROM friends f 
JOIN users u 
    ON u.userID = f.friendID 
WHERE f.userID = 1) 
+0

Вы все еще, вероятно, хотите, чтобы обернуть, что в SELECT DISTINCT так что вы не получаете дубликатов. – Brad

+0

@Brad, спасибо за комментарий, но UNION автоматически удаляет повторяющиеся строки. –

+0

О, я так и не понял!Спасибо за информацию – Brad

2
SELECT DISTINCT s.FriendId 
FROM (
    SELECT f.FriendId 
    FROM Friends f 
    WHERE f.UserId = @id 
    UNION ALL 
    SELECT f.UserId 
    FROM Friends f 
    WHERE f.FriendId = @id 
) s 
WHERE s.FriendId != @id 

Возможно, вам не понадобится последний ГДЕ, поскольку пользователь, вероятно, не добавляет себя в качестве друга.

+0

Предположительно вы можете сделать что-то вроде: 'SELECT DISTINCT s.FriendId, u.Username FROM (SELECT, f.FriendId из друзей е WHERE f.UserId = @id UNION ALL ВЫБОР f.UserId От друзей F WHERE f.FriendId = @id ) s РЕГИСТРИРУЙТЕСЬ Usernames Мириэль u.Id = s.FriendId ГДЕ s.FriendId! = @ id' – Daan

2

В то время как вы хранения данных может показаться эффективным, то следующий подход может быть лучшим подходом: Когда создается дружеская дружба, введите данные дважды: один раз как userID (1) friendID (24) и один раз как userID (24) friendID (1). Причина, по которой этот подход может быть хорошим, заключается в том, что он делает вашу таблицу многоразовой.

В настоящее время ваш стол похож на facebook: если я твой друг, тогда ты должен быть моим другом: я вижу твою деятельность; вы видите мои действия. Дизайн, который я объясняю, позволяет использовать таблицу как в facebook, так и в twitter: только потому, что вы следите за моими действиями, это не значит, что я хочу следовать за вами.