Выберите две строки одним SQL-запросом

Привет всем, у меня есть эта структура таблицы

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

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,

2

Другие решения

Это работает для имени пользователя

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;
0

@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
;
0
По вопросам рекламы [email protected]