选择可以包含2列中的值的数据列表

时间:2018-11-19 11:50:52

标签: sql postgresql

我有一个“朋友请求”表,其中包含两个用户(收件人和发送者)之间的朋友请求数据,以及“朋友请求状态”(“接受”,“拒绝”):

enter image description here

我想检索ID为1的User的朋友,包括2、3、4,如果可能,请按名称顺序检索。

我的朋友是指(例如,一个用户1是另一个用户的发送者或接收者,例如2,并且friendrequeststatus的值为ACCEPETED)。 “朋友”是指用户(例如1)作为接收者或发送者的所有列的接受请求的状态。

我尝试过 `

 select request.*
from friendrequest request
where 1 in (request.recipient, request.sender) 

enter image description here

1 个答案:

答案 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来确保同一个人不会被两次举报(如果他们是一条记录中的发件人,而另一条记录中的收件人……如果可能的话)。它按该生成的列排序。