时间:2021-07-01 10:21:17 帮助过:21人阅读
ID | cat_id |
---|---|
1 | 1,2,4 |
2 | 2,3 |
3 | 11,13,17,19 |
4 | 3,7,9,12 |
这是某多对多关系在基于mysql的数据表中的表现形式(因为上头说应用小用两个表就算了)
并且筛选查询的要求如下表
推送条件 | 期望结果(ID) |
---|---|
1 | 1 |
1,2 | 1 |
1,3 | null |
3,9 | 4 |
3 | 2,4 |
注:推送条件和期望结果都是以
,
隔开,实际上是个一维索引数组
推送条件之间是AND
关系
目前鄙人想到的基于thinkphp
的解决方案是:
1.遍历查询结果,将cat_id化为数组
2.判断推送条件(数组形式,可以认为就是表单POST来的一维数组)是不是cat_id数组的子集。
然而问题就在遍历查询结果,这里测试是:结果如果达到6000+条,执行时间需要3~20秒左右,比较慢。
于是问一下,上表这样的筛选要求能不能用sql语句实现,从而省掉遍历的过程?
先上数据示例
ID | cat_id |
---|---|
1 | 1,2,4 |
2 | 2,3 |
3 | 11,13,17,19 |
4 | 3,7,9,12 |
这是某多对多关系在基于mysql的数据表中的表现形式(因为上头说应用小用两个表就算了)
并且筛选查询的要求如下表
推送条件 | 期望结果(ID) |
---|---|
1 | 1 |
1,2 | 1 |
1,3 | null |
3,9 | 4 |
3 | 2,4 |
注:推送条件和期望结果都是以
,
隔开,实际上是个一维索引数组
推送条件之间是AND
关系
目前鄙人想到的基于thinkphp
的解决方案是:
1.遍历查询结果,将cat_id化为数组
2.判断推送条件(数组形式,可以认为就是表单POST来的一维数组)是不是cat_id数组的子集。
然而问题就在遍历查询结果,这里测试是:结果如果达到6000+条,执行时间需要3~20秒左右,比较慢。
于是问一下,上表这样的筛选要求能不能用sql语句实现,从而省掉遍历的过程?
个人感觉,应该可以用sql语句实现,可以写几个存储函数,但这样一来,估计工作量上可能比多加个中间表要困难许多,而且速度上估计也快不了,建议还是建个中间表
这种集合的问题交给 redis
来做最方便不过了
127.0.0.1:6379> SADD cid_1 1
127.0.0.1:6379> SADD cid_2 1
127.0.0.1:6379> SADD cid_2 2
127.0.0.1:6379> SADD cid_3 2
127.0.0.1:6379> SADD cid_4 1
127.0.0.1:6379> SINTER cid_1 cid_2
1) "1"
127.0.0.1:6379> sinter cid_2 cid_3
1) "2"
首先谢谢大家热心的回答
然后最后采取的方案是,将关系表和其中一个存储数据比较少的简单表合并,并在此基础上用两个id区分
具体是模仿了无限子级菜单的那种建表方式