台灣最大程式設計社群網站
線上人數
1216
 
會員總數:243449
討論主題:188175
歡迎您免費加入會員
討論區列表 >> MySQL >> 一個類似 in() 的查詢問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
一個類似 in() 的查詢問題
價值 : 60 QP  點閱數:239 回應數:5

樓主

老古
初學者
81 110
1192 146
發送站內信


各位高手大大您們好,小弟目前有一個問題求解.......希望有大大能解惑 0.0+

資料表欄位名稱:ttt
欄位內的值為: 1,2,3,4,5,6,7,8,9
欄位內的值為: 1,3,5,7,8
欄位內的值為: 1,2,5,8,6

程式的變數名稱為:$mtt
變數中的值為:2,6,8

小弟的疑問是.........如果資料表 ttt 欄位內的內容都是這種資料型態,那麼該用什麼樣的sql查詢語法或方式將 ttt 欄位內符合 $mtt變數中的 2 或 6 或 8 只有比對到三者其1的就列出
除了用 like 還有其它方式嗎?

因為like太吃cpu資源了 QQ

煩請了解的大大解惑矣~~感恩




搜尋相關Tags的文章: [ SQL查詢 ] ,
本篇文章發表於2018-11-02 11:20
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應

就這樣子用就好了。
本篇文章回覆於2018-11-02 15:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

老古
檢舉此回應
回星空大大:

先感謝星空大大的指點 0.0+

小弟再請教......如您所說的方式,我就要把 變數內的值拆開來重新用 find_in_set 組合成新的sql查詢字串,這個小事,剩下的就是......如果這樣的資料存在數百萬筆時,會很吃cpu資源或是效能查詢上會很差嗎 @@?
另外~~這種查詢方式建立索引會有效嗎 @@?

如果星空大大了解的話~~可否再浪費一些時間請您為我解惑 0.0...感恩 ^^
本篇文章回覆於2018-11-02 15:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
理論上真的有上百萬筆數的話,還是會的。因為這只是降低消耗的效能。其實目前你是只有三個條件。如果再更多組的話。
還是會跟用like差不多的效能。

建立索引其實是沒什麼用的。

其實這堿O有幾招可以教你啦。

一般如果你的tag值不會超過10個的情況下。
我會用二進制碼比對式。也就是儲存的是將二進制中的「0000000000」來當成為10個tag
則如下的條件
欄位內的值為: 1,2,3,4,5,6,7,8,9
其對應的就是「1111111110」=> 1022

欄位內的值為: 1,3,5,7,8
其對應的就是「1010101100」=> 684

欄位內的值為: 1,2,5,8,6
其對應的就是「1100110100」=> 820

再將其化成10進位值儲存。

這樣你一但要找2 6 8的tag。也就是先對應到「0100010100」 => 276

只要下達 select * from where ttt & 276 = 276 就行了。
數值運算會方式就會快很多。

不過這一招不適用用在超過20個tag的情況。或是不定數tag的情況

所以,再多教你一招,index表應用法。

多增加一個表。其欄位如下

主表的id typeid(這奡N是要放你ttt內的值)
然後建立成組合式唯一鍵索引。

其值假設你的第一筆id是1的情況下。其ttt值是1,2,3,4,5,6,7,8,9
第二筆id2 其ttt值是 1,3,5,7,8
這樣其index表的儲存就是如下


則依上面的例子下如下的sql語法




以上可能說的很模糊。不懂再問吧。
本篇文章回覆於2018-11-02 17:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

老古
檢舉此回應
超級感激 星空版大 花了大把時間指導,真的超級感激!!

您說的一點也不模糊,相當明白也相當清楚!!

我想我會使用星空版大的第二種方式 0.0...因為我也google了一些資料就如星空版大所說的是一樣的。

以您所指導的方式,第一種 find_in_set 我的表將會有上百萬筆資料
以您所指導的方式,後者使用 index表的方式,這個表將會存放上千萬筆的資料,不過看來也只能用 index 表的方式了 @@
因為這表一來是未來數據分析用的表,二來每次使用系統功能也一定會用到這個表(非常態性使用...所以還好),三來這個表會時常在一段時間內湧入上百次的QUERY,有可能INSERT,有可能UPDATE,(這個俺比較擔心....)

不過有星空大如此盡心的指導又讓小弟學到了新知,真的是感激感激再感激,多謝星空大 ^^
本篇文章回覆於2018-11-05 09:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
這埵A教你index表的應用方式好了。

index表內的東西,干萬不要用update的方式。由其是千萬筆以上。
你可以用的是delete與INSERT。

其實原因也是很單純。
delete與INSERT不會發生全表讀取的問題,但update會。
所以一但資料達百萬以上,用update就會特別的慢。
雖然搭配了索引,但還是會比較慢。
就我之前找到的資料說明。是update要處理的動作比較多。
且會有機會發生全表應用的情況。

但DELETE跟INSERT就不容易發生全表應用上的問題。

所以一般來說,一但發生需要變動更新的情況。我大多還是會用砍掉該應對的ID組合後再重建。
本篇文章回覆於2018-11-05 15:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.