匹配红色和绿色标志的 SQL 查询

问题描述 投票:0回答:1

对于约会应用程序,用户必须设置描述他/她自己的白旗。然后,他/她(我没有在示例数据中涵盖性别)可以选择几个具有优先级的绿色和红色标记,用于寻找潜在的合作伙伴。优先级用于优先考虑白旗、绿旗和红旗。数字越低意味着越重要。

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);
sql postgresql sorting
1个回答
0
投票

用于查找用户 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;
© www.soinside.com 2019 - 2024. All rights reserved.