对于约会应用程序,用户必须设置描述他/她自己的白旗。然后,他/她(我没有在示例数据中涵盖性别)可以选择几个具有优先级的绿色和红色标记,用于寻找潜在的合作伙伴。优先级用于优先考虑白旗、绿旗和红旗。数字越低意味着越重要。
A 是素食主义者,喜欢狗但讨厌猫。 B 是素食主义者,喜欢狗。 C 与 B 相同,但比起素食主义者更喜欢狗。 D是素食主义者,喜欢狗也喜欢猫。
是否有一个 SQL 查询能够以排序的方式返回 A 的最佳匹配项?
想要的结果:[B,C]
有没有办法进行微调,使用 B、C 和 D 的绿色和红色标记来更好地优化结果?
https://www.db-fiddle.com/f/wReW6mTbypRyCuV6iHuDjn/5
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');
INSERT INTO users (name) VALUES ('B');
INSERT INTO users (name) VALUES ('C');
INSERT INTO users (name) VALUES ('D');
INSERT INTO flags (name) VALUES ('Vegetarian');
INSERT INTO flags (name) VALUES ('Vegan');
INSERT INTO flags (name) VALUES ('Dog owner');
INSERT INTO flags (name) VALUES ('Cat owner');
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (1,'white',1,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (1,'white',3,2);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (1,'green',1,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (1,'green',3,2);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (1,'red',4,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (2,'white',1,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (2,'white',3,2);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (2,'green',1,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (2,'green',3,2);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (3,'white',1,2);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (3,'white',3,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (3,'green',1,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (3,'red',3,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (4,'white',1,1);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (4,'white',3,2);
INSERT INTO userflags (user_id, color, flag_id, priority) VALUES (4,'white',4,3);
用于查找用户 A 的最佳匹配的可能的 SQL 查询可能如下所示:
SELECT
u.name,
SUM(CASE WHEN uf.color = 'green' THEN uf.priority ELSE 0 END) AS green_priority,
SUM(CASE WHEN uf.color = 'red' THEN uf.priority ELSE 0 END) 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;