先上資料樣本
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區分
具體是模仿了無限子級菜單的那種建表方式