Настройка:
CREATE TABLE t (id INTEGER, status TEXT, recipient INTEGER, sender INTEGER);
INSERT INTO t
VALUES
(1, 'ACCEPTED', 2, 1),
(2, 'ACCEPTED', 3, 1),
(3, 'ACCEPTED', 1, 4),
(4, 'REJECTED', 5, 1),
(5, 'REJECTED', 1, 5),
(6, 'ACCEPTED', 6, 7),
(7, 'ACCEPTED', 1, 2);
Запрос:
SELECT DISTINCT CASE sender WHEN 1 THEN recipient ELSE sender END AS friends
FROM t
WHERE 1 IN (recipient, sender)
AND status = 'ACCEPTED'
ORDER BY 1
Результаты:
| friends |
| ------- |
| 2 |
| 3 |
| 4 |
https://www.db -fiddle.com / f / sfbFeXCvWkoSagJEipfxSr/ 0
Итак, сначала я добавил еще несколько данных, чтобы доказать, что используются только правильные данные.Запрос проверяет получателя / отправителя на 1, как вы это делали в своем запросе.Он также проверяет поле состояния на «ПРИНЯТО», а затем создает один столбец, используя значение, которое не является 1
(оператор CASE) для значения друга из правильного столбца.Затем он выполняет DISTINCT, чтобы убедиться, что об одном и том же человеке не сообщается дважды (если он отправитель в одной записи и получатель в другой ... если это вообще возможно).Заказы по этому сгенерированному столбцу.