Какие есть способы завести общих друзей в сценарии дружбы (1, 2) (2, 1) ?

StackOverflow https://stackoverflow.com//questions/9663607

  •  12-12-2019
  •  | 
  •  

Вопрос

Я разрабатываю веб-сайт, на котором, когда человек добавляет другого человека в друзья, создаются 2 записи.Допустим, uid 1 добавляет uid 2 как друг, следующие строки создаются в MySQL.

activity_id   uid1 uid2
     1         1     2
     2         2     1

uid 2 становится другом с uid 3:

activity_id   uid1 uid2
     1         1     2
     2         2     1
     3         2     3
     4         3     2

Какие есть способы завести общих друзей между uid 1 и uid 2?Я использую php и MySQL без опыта работы с PDO (на данный момент).

[ПРАВИТЬ] Итак, я решил упорядочить / нормализовать таблицы.Теперь связь генерирует только 1 строку.что составляет таблицу:

activity_id   uid1 uid2
     1         1     2
     2         2     3
Это было полезно?

Решение

Смотреть на таблице Формат с вашего Другое вопрос, это должно делать то, что вы хотите;

SELECT name FROM users u
JOIN friends f1
  ON u.uid = f1.uid OR u.uid = f1.fid
JOIN friends f2
  ON u.uid = f2.uid OR u.uid = f2.fid
WHERE (f1.uid=1 OR f1.fid=1) AND (f2.uid=3 OR f2.fid=3) 
  AND u.uid<>1 AND u.uid<>3;
.

Demo Здесь .

Другие советы

Предполагая, что вы назвали ваши таблицы «друзья».

Этот запрос найдет общие друзья для пользователей 1 и 3.

SELECT a.uid2
  FROM friends a
    INNER JOIN friends b
       ON a.uid2 = b.uid2
  WHERE a.uid1 = 1
   AND b.uid1 = 3
.

Не думаете, что это может быть немного самонадельно сделать 2 ряда?Может быть, UID 2 не очень нравится UID 1?(ОТИ).

Чтобы найти всех общих друзей uid 1 и uid 2:

SELECT t1.uid2
FROM   tbl t1
JOIN   tbl t2 USING (uid2)
WHERE  t1.uid1 = 1
AND    t2.uid1 = 2;

Однако есть один особый случай:этот запрос не показывает, является ли 1 & 2 мы друзья!

Кстати, ваш дизайн кажется немного избыточным.Это должно работать только с одной записью на дружбу.(Однако этот запрос должен быть адаптирован для этого.)

По сути, это еще один случай относительное разделение.Существует много различных способов освежевать эту кошку. Найдите ответ на этот связанный с этим вопрос - включая тестирование производительности и дополнительную информацию.


Запрос на обновленный вопрос

Теперь на каждую дружбу приходится только 1 строка - пользователь может появиться в любом столбце:

SELECT uid
FROM (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 1
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 1
    ) u1
JOIN (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 2
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 2
    ) u2 USING (uid)
$query="SELECT distinct(uid2) FROM `test` where uid1=$uid union select distinct(uid1) from test where uid2=$uid";
.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top