Какие есть способы завести общих друзей в сценарии дружбы (1, 2) (2, 1) ?
-
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";
.