我有一个“朋友请求”表,其中包含两个用户(收件人和发送者)之间的朋友请求数据,以及“朋友请求状态”(“接受”,“拒绝”):
我想检索ID为1的User的朋友,包括2、3、4,如果可能,请按名称顺序检索。
我的朋友是指(例如,一个用户1是另一个用户的发送者或接收者,例如2,并且friendrequeststatus的值为ACCEPETED)。 “朋友”是指用户(例如1)作为接收者或发送者的所有列的接受请求的状态。
我尝试过 `
select request.*
from friendrequest request
where 1 in (request.recipient, request.sender)
答案 0 :(得分:1)
设置:
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,就像您在查询中所做的一样。它还会检查状态字段是否为“ ACCEPTED”,然后使用正确的列中的好友值不使用1
(CASE语句)的值来创建单个列。然后,它执行DISTINCT来确保同一个人不会被两次举报(如果他们是一条记录中的发件人,而另一条记录中的收件人……如果可能的话)。它按该生成的列排序。