sql中字串匹配問題

來源:互聯網
上載者:User
先上資料樣本

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區分

具體是模仿了無限子級菜單的那種建表方式

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.