我有一个挂锁表,它(不幸的)由一个带有逗号分隔数据的列组成. 表由挂锁组成,带有给定挂锁的锁类型的信息(以及它是大的还是小的). 给我一把 keys ,它可以解锁某些类型的锁(和大小),我想找出我可以解锁的挂锁.键还具有逗号分隔的Lock类型和大小.
Padlocks个
Name | Locks | Size |
---|---|---|
A | KL, OK, CZ, CZ | Small |
B | OK, OK | Small |
C | OK, CZ, KL | Small |
D | RO, CZ, CZ | Small |
E | OK, OK, KL, KL | Small |
F | OK, OK, CZ, KL | Big |
(输入)键(‘KL,OK,OK,CZ,CZ’,‘Small’)将返回
Name |
---|
A |
B |
C |
请注意,如果一把 keys 只能解锁‘KL’的一个实例,则它不会解锁‘E’,因为它需要两个‘KL,KL’.挂锁‘D’无法解锁,因为它需要‘RO’.挂锁‘F’无法解锁,因为它需要‘Big’ keys .
如果是像C#这样的编程语言,我会做什么,我会将Key的输入拆分成数组[‘KL’,‘OK’,‘OK’,‘CZ’,‘CZ’],对于每一行,我还会将Lock拆分成数组,并比较两个数组
伪码
foreach Lock in Locks
for(i=0;i<UBound(Lock);i++)
for(j=0;i<UBound(Key);j++)
If(Lock[i]=Key[j]) Lock[i].Remove Key[j].Remove
如果在某个点上Lock的值为0,则键可以打开该锁.但这远远超出了我在MariaDB中所能做的事情. 我知道FIND_IN_SET(),但它只允许我搜索一个输入,除非有方法可以使用它来满足我的需要
PS SELECT@@Version=10.3.39-MariaDB-0+deb10u2
PS2 正常化有帮助吗?我的意思是,我可以创建一个表Locks,它可以保存所有的锁类型,然后为挂锁创建一个交叉引用表-Locks.有没有一个SQL语句可以让我得到我需要的东西?