Система дружбы Sql Структура и запрос - PullRequest
4 голосов
/ 25 декабря 2009

Я кодирую систему дружбы и у нее две таблицы.

Участники

  • ID
  • имя пользователя
  • пароль

друзья

  • ID
  • user_id
  • friend_id
  • состояние

Допустим, я хочу запрос, в котором можно выбрать идентификаторы друзей члена $ userId, как можно сделать это за один запрос?

Я нашел решение, которое состоит в том, чтобы сделать 2 запроса. Первый выбирает друзей WHERE user_id = $userId, а второй выбирает друзей WHERE friend_id = $userId, а затем смешивает их в один массив. Если нет другого решения, я собираюсь его использовать.

пожалуйста, есть ли у вас идеи по структуре SQL и запросам?

Ответы [ 4 ]

4 голосов
/ 25 декабря 2009

Использование:

SELECT f.friend_id
  FROM FRIENDS f
 WHERE f.user_id = $user_id
UNION
SELECT t.user_id
  FROM FRIENDS t
 WHERE t.friend_id = $user_id

Использование UNION удалит дубликаты. UNION ALL будет быстрее, но не удаляет дубликаты.

Если вы хотите получить информацию для друзей из таблицы MEMBERS, используйте:

SELECT m.*
  FROM MEMBERS m
  JOIN (SELECT f.friend_id 'user_id'
          FROM FRIENDS f
         WHERE f.user_id = $user_id
        UNION
        SELECT t.user_id
          FROM FRIENDS t
         WHERE t.friend_id = $user_id) x ON x.user_id = m.id

Кстати: я надеюсь, что вы используете mysql_escape_string для переменных, в противном случае вы рискуете атак с использованием SQL-инъекций: alt text

1 голос
/ 26 декабря 2009

Почему бы не вставить 2 строки для 1 дружбы. Например:

Допустим, у нас 2 пользователя станут друзьями

User_id: 1 & Friend_id: 2

insert into friends (user_id, friend_id, status) values (1,2,0)    
insert into friends (user_id, friend_id, status) values (2,1,0)

, чтобы вы могли легко выбирать простым запросом выбора.

Также это облегчит боль для вашего следующего вероятного вопроса «Как найти общих друзей».

1 голос
/ 25 декабря 2009

Вы можете попробовать использовать

SELECT  m.*
FROM    friends f INNER JOIN
        members m ON f.friend_id = m.user_id
WHERE   f.user_id = $userId

Это даст вам все Друзья Детали

Чтобы получить ОБА, взгляните на

SELECT  DISTINCT CASE WHEN f.user_id = $userId then f.friend_id else f.user_id END CASE
FROM    friends f 
WHERE   f.user_id = $userId
OR      f.friend_id = $userId
0 голосов
/ 25 декабря 2009

Поскольку вы просите что-то простое, например:

SELECT friend_id FROM friends WHERE user_id = id; [fill in the id]

Я дам тебе кое-что более изворотливое:

SELECT * FROM members AS m
WHERE m.id
IN (SELECT f.friend_id FROM friends AS f
  WHERE f.user_id = (SELECT pm.id FROM members AS pm
    WHERE pm.username = 'amindzx'));

Лучше использовать соединение по подзапросу.

Также нет необходимости в id в столбце друзей, потому что должна существовать только одна связь между user_id и friend_id; оба они могут быть описаны как id столбцы в унисон.

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