Как моделировать дружеские отношения

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

У меня есть два стола, users_status а также friendships,

в users_status таблица у меня есть поле useridи несколько других. в friendships таблица, у меня есть поля request_to,request_from, а также friendship_status,

По сути, я хочу получить все сообщения о статусе текущего пользователя и тех, кто является друзьями текущего пользователя (что я могу указать в своем PHP с помощью переменной $userid).

Вот пример friendships структура таблицы. Когда отправляется запрос на добавление в друзья, ИД пользователя отправителя и получателя помещаются в таблицу, с значением Friends_status, равным 0. Когда запрос принят, для параметра Friends_status устанавливается значение 1, и эти двое теперь являются друзьями.

friendship_id   request_from    request_to  friendship_status
1               111248          111249      1
2               111209          111249      1
3               111209          111248      0
11              111209          111259      1
5               111252          111209      1
12              111261          111209      1

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

Возможно, было бы лучше иметь две отдельные таблицы для friend_requests а также friendships? Если это так, как бы я структурировать / управлять friendships Таблица?

2 ответа

Решение

Вы можете использовать объединение таблиц (например, http://dev.mysql.com/doc/refman/5.0/en/join.html), чтобы найти все запросы.

На самом деле вы можете использовать подзапрос здесь:

SELECT * FROM users_status WHERE userid = "$userid" 
    OR userid in (SELECT request_to   FROM friendships where request_from = "$userid" AND friendship_status = 1)
    OR userid in (SELECT request_from FROM friendships where request_to   = "$userid" AND friendship_status = 1)

замещать $userid с вашим идентификатором пользователя

Самая простая схема, которую я могу придумать:

PENDING_FRIENDSHIPS(request_from, request_to)
FRIENDSHIPS(request_from, request_to)

Я также удалил идентификатор, потому что оба поля в обеих таблицах будут составными первичными ключами (request_from, request_to).

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

select * from friendships
where $currentUser = request_from OR $currentUser = request_to

Это вернет оба столбца, и вам придется удалить в PHP текущего пользователя.

Другой способ получить всех друзей из этой схемы - запустить UNION:

select request_from from friendships
where request_to = $currentUser
UNION
select request_to from friendships
where request_from = $currentUser

Недостатком этого решения является то, что вы запускаете 2 выбора

Другие вопросы по тегам