Привет всем, у меня есть эта структура таблицы
id | u_id2 | u_id2
1 | 8 | 10
2 | 10 | 1
3 | 9 | 8
4 | 1 | 8
С помощью этого SQL-запроса он пытается получить все отношения с друзьями с 8 как user_id
SELECT
u.id
FROM up2_users u
RIGHT JOIN up2_friends f
ON u.id = f.u_id1
WHERE f.u_id1 = :user_id OR f.u_id2 = :user_id
Результат вроде нормальный, но не совсем правильный. : user_id = 8
8, 9, 1
Вы видите в таблице выше, что 8 — это: user_id, и он должен возвращать 10, а не 8 из f.u_id2
Но если я наберу
ON u.id = f.u_id1 AND u.id = f.u_id2
Я получаю все результаты в два раза и 8
Есть ли способ выполнить то, что мне нужно в одном запросе?
Правильный возврат должен быть 10, 9, 1
Вам не нужно join
по этому запросу. Вы хотите условно вернуть Другой идентификатор пользователя, поэтому используйте case
:
SELECT (case when f.u_id1 = :user_id then f.u_id2 else f.u_uid1 end) as id
FROM up2_friends f
WHERE f.u_id1 = :user_id OR f.u_id2 = :user_id;
Если вы не хотите дубликатов, используйте select distinct
,
Это работает для имени пользователя
SELECT (case when f.u_id1 = :user_id then f.u_id2 else f.u_id1 end) as id,
u.username
FROM up2_friends f
RIGHT JOIN up2_users u
ON u.id=f.u_id1
WHERE f.u_id1 = :user_id OR f.u_id2 = :user_id
ORDER BY u.username;
@Konter На основании вашего недавнего комментария на предложение Гордона, вы можете искать что-то вроде
SELECT
u.id
, Friendship.friend2 friend
FROM up2_users u
JOIN (SELECT u_id1 friend1, u_id2 friend2 FROM Friend
UNION ALL
SELECT u_id2, u_id1 FROM Friend) Friendship
ON u.id = Friendship.friend1
WHERE u.id = 8
ORDER BY friend1, friend2
;