对于约会应用程序,用户必须设置描述他/她的白旗.他/她(我不包括示例数据中的性别)然后可以 Select 几个绿旗和红旗,它们具有优先级,用于寻找潜在的伴侣.优先级用于对白色、绿色和红色旗帜进行优先排序.数字越小,意味着越重要.

  • A是素食主义者,喜欢狗,但讨厌cat .
  • B是素食主义者,喜欢狗.
  • C和B是一样的,但比起素食者,C更喜欢狗.
  • D是素食主义者,喜欢狗和cat .

是否存在以排序方式返回A的最佳匹配项的SQL查询?

想要的结果:[B,C]

有没有办法对此进行微调,使用B、C和D的绿旗和红旗来更好地优化结果?

Fiddle

CREATE TABLE users (
  id serial PRIMARY KEY,
  name varchar(255)
);

CREATE TABLE flags (
  id serial PRIMARY KEY,
  name varchar(255)
);

CREATE TABLE userflags (
  id serial PRIMARY KEY,
  user_id integer REFERENCES users (id),
  color varchar(255),
  flag_id integer REFERENCES flags (id),
  priority integer
);
INSERT INTO users (name) VALUES ('A'),('B'),('C'),('D');

INSERT INTO flags (name) VALUES 
('Vegetarian'),('Vegan'),('Dog owner'),('Cat owner');

INSERT INTO userflags (user_id, color, flag_id, priority) VALUES 
 (1,'white',1,1)
,(1,'white',3,2)
,(1,'green',1,1)
,(1,'green',3,2)
,(1,'red',  4,1)

,(2,'white',1,1)
,(2,'white',3,2)
,(2,'green',1,1)
,(2,'green',3,2)

,(3,'white',1,2)
,(3,'white',3,1)
,(3,'green',1,1)
,(3,'red',  3,1)

,(4,'white',1,1)
,(4,'white',3,2)
,(4,'white',4,3);

推荐答案

为用户A查找最佳匹配的可能的SQL查询可能如下所示:

SELECT 
    u.name,
    SUM(uf.priority)FILTER(WHERE uf.color='green') AS green_priority,
    SUM(uf.priority)FILTER(WHERE uf.color='red') AS red_priority
FROM
    users u
JOIN
    userflags uf ON u.id = uf.user_id
JOIN
    flags f ON uf.flag_id = f.id
WHERE
    u.id <> 1 AND -- exclude user A
    f.name IN (
        SELECT 
            f2.name 
        FROM 
            userflags uf2 
        JOIN 
            flags f2 ON uf2.flag_id = f2.id
        WHERE 
            uf2.user_id = 1 AND uf2.color IN ('green', 'red')
    )
GROUP BY 
    u.name
ORDER BY 
    red_priority ASC, green_priority DESC;

Sql相关问答推荐

SQL查询组类值在同一行中,并连接和排序其他值

在SQL查询中使用COALESS

在查询Oracle SQL中创建替代ID

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

明细表中没有记录如何更新主表的值为0

SQL数据库规范化与数据插入

根据时间、状态和相关行在PostgreSQL中的存在来删除行

违反了完整性约束-值存在时找不到父键

显示所有组并计算给定组中的项目(包括 0 个结果)

统计重复记录的总数

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

SQL Select 字母范围没有给我任何东西

获取上个月和上一年的值

用户定义的标量值函数是否仍然会阻止并行性?

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

正则表达式:停在第一个匹配的其中一个字符位置上

每个ID的SQL返回可能的最低级别及其值

在 MS Access VBA 中,如何测量显示查询的时间?

如何在 PL/SQL 中区分返回的 XML 值?

SQL/Postgres:按日期和其他属性对相关性能进行分组