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

标签 sql postgresql

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

enter image description here

我想检索 ID 为 1 的用户的 friend ,其中包括 2、3、4,如果可能的话,按姓名顺序检索他们。

我所说的 friend 是指(用户例如 1 是另一个用户例如 2 的发送者或接收者,并且 friendrequeststatus 的值为 ACCEPETED)。我所说的 friend 是指用户的所有列,例如 1,无论是作为收件人还是发件人,都具有已接受的 friend 请求状态。

我试过了 `

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

enter image description here

最佳答案

设置:

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 语句)创建一个单独的列,以形成正确的列的 friend 值。然后它执行一个 DISTINCT 以确保同一个人不会被报告两次(如果他们是一个记录中的发件人和另一个记录中的收件人……如果可能的话)。它按生成的列排序。

关于sql - 选择可以包含 2 列值的数据列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374054/

相关文章:

mysql - 无法解析 MySQL 语句

sql - 如果字符串中有单词,Postgresql 如何更新列?

SQL:根据 postgresql 中的字段返回忽略重复项的所有记录

ruby-on-rails - PG错误不知道如何调试

sql - 在多对多关系中选择匹配子集

sql - postgres 中的缓慢更新脚本

mysql - 同一SQL语句中的多个条件计数

mysql - varchar 类型列的排序依据

SQL将分号列表转换为关系表

mysql - 多对多关系mysql设计