mysql根据偏好匹配两个用户

pkwftd7m  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(318)

好吧,我需要完成的是有点复杂,但我会尽我所能解释。所以我有一张这样的table:
id | |颜色| |红色| |蓝色| |黄色| |绿色| |橙色
1-||----1---||----1-----||-----1-----||-------1------||------0------||------1------
2-||----3---||----1-----||-----0-----||-------1------||------1------||------1------
3-||----1---||----0-----||-----0-----||-------0------||------0------||------1------
4-||----5---||----1-----||-----1-----||-------0------||------1------||------1------
5-||----2---||----0-----||-----0-----||-------1------||------0------||------1------
在“颜色”字段中,数字1-5表示用户最喜欢的颜色(1表示红色,2表示蓝色,3表示黄色,4表示绿色,5表示橙色)。redok、blueok、yellowok、greenok和orangeok字段表示用户是否愿意与某个特定颜色的人进行匹配。在这些字段中,1表示是,0表示否。因此,例如,id=1的用户最喜欢的颜色是红色,因为他们的“颜色”字段是1,他们愿意与最喜欢的颜色是红色、蓝色、黄色或橙色,但不是绿色的人匹配,因为“greenok”字段是0。因此,我需要做的是创建一个存储过程,它返回一个查询,查询的用户的颜色和颜色首选项与特定用户的颜色和颜色首选项匹配。例如,id为1和2的用户是匹配的,因为用户1是红色的,用户2选择了红色是正常的,用户2是黄色的,用户1选择了黄色是正常的。另一方面,用户3和用户2不匹配,因为即使用户3是红色的,用户2选择了红色是可以的,用户2是黄色的,用户3说只有橙色是可以的。
我整天都在想这个问题,但还没想出解决办法。我的第一个想法是使用select inner join语句,但我不太清楚为什么,因为有这么多可能的组合?然后我尝试创建一个带有用户首选项的临时表,然后使用光标遍历这些首选项,同时检查用户的首选项是否与目标用户的颜色匹配,但我也没有弄清楚。你们能帮忙吗?

inb24sb2

inb24sb21#

对于表,只有五个组合指示匹配,您可以简单地或一起在一个连接中,在a->b和a<-b两个方向上:

select *
from myTable a
join myTable b on (
        (a.color = 1 and b.redOK = 1)
        or (a.color = 2 and b.blueOK = 1)
        or (a.color = 3 and b.yellowOK = 1)
        or (a.color = 4 and b.greenOK = 1)
        or (a.color = 5 and b.orangeOK = 1)
    ) and (
        (b.color = 1 and a.redOK = 1)
        or (b.color = 2 and a.blueOK = 1)
        or (b.color = 3 and a.yellowOK = 1)
        or (b.color = 4 and a.greenOK = 1)
        or (b.color = 5 and a.orangeOK = 1)
    )
where a.id <> b.id

或者,您可以更改您的模式,实质上是取消将数据放入多对多表中。例如:

id    okColor
1     1
1     2
1     3
1     5
2     1
2     3
2     4
2     5

在这种情况下,您可以通过以下表联接:

select distinct a.id, b.id
from myTable a
join okColors aOK on a.id = aOK.id
join myTable b on aOK.okColor = b.color
join okColors bOK on bOK.id = b.id and a.color = bOK.okColor
where a.id <> b.id

相关问题