Re: [SQL ] 多重欄位值序列或組合的複合搜尋

看板Database作者 (NeverEver)時間13年前 (2010/09/26 20:39), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串5/5 (看更多)
不知道你手邊資料有多少, 試試看這樣子有沒有比較快 select * from `基本資料` left join (select `學生ID`, group_concat(`喜歡`) `喜歡` from `喜歡表` group by `學生ID`) v1 using(`學生ID`) left join (select `學生ID`, group_concat(`討厭`) `討厭` from `討厭表` group by `學生ID`) v2 using(`學生ID`) ; ※ 引述《danny0838 (道可道非常道)》之銘言: : : 表一:基本資料 : : 表二:喜歡表 : : 表三:討厭表 : : 學生ID是primary key,要如何輸出成如下格式: : : 學生ID 姓名 喜歡 討厭 : : ------------------------------------------------------ : : 1 王大明 吃飯,打槍,上網 小強,螞蟻,讀書 : : 2 菜阿信 看書,電影,漫畫 芝麻,青蛙 : : 推 evernever:你可以看一下 group_concat 怎麼用 09/26 09:07 : 我初步研究過,如果只要輸出`喜歡`,我知道基本作法是: : SELECT `學生ID`,`姓名`,GROUP_CONCAT(`喜歡` SEPERATOR ',') : FROM `基本資料` : LEFT JOIN `喜歡表` USING (`學生ID`) : GROUP BY `學生ID` : 以上執行速度極快。 : 可是要再加上`討厭`就有點棘手了,如果用: : SELECT `學生ID`,`姓名`, : GROUP_CONCAT(`喜歡` SEPERATOR ',') AS `喜歡`, : GROUP_CONCAT(`討厭` SEPERATOR ',') AS `討厭` : FROM `基本資料` : LEFT JOIN `喜歡表` USING (`學生ID`) : LEFT JOIN `討厭表` USING (`學生ID`) : GROUP BY `學生ID` : 結果會變成: : 學生ID 姓名 喜歡 討厭 : ------------------------------------------------------------------------------ : 1 王大明 吃飯,打槍,上網,吃飯,打槍,上網, 小強,螞蟻,讀書,小強,螞蟻,讀書, : 吃飯,打槍,上網 小強,螞蟻,讀書 : 以上執行速度相當快。 : 如果用: : SELECT `學生ID`,`姓名`,`喜歡`,GROUP_CONCAT(`討厭` SEPERATOR ',') AS '討厭' : (SELECT `學生ID`,`姓名`,GROUP_CONCAT(`喜歡` SEPERATOR ',') AS `喜歡` : FROM `基本資料` : LEFT JOIN `喜歡表` USING (`學生ID`) : GROUP BY `學生ID`) AS `t1` : LEFT JOIN `討厭表` USING (`學生ID`) : GROUP BY `學生ID` : 是可以得到我要的結果啦...但速度很慢...有辦法優化嗎? : `喜歡表`和`討厭表`都有加上`學生ID`作為index key,以下是 EXPLAIN 結果: : id sel_type table type p_keys key k_len ref rows Extra : 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 140508 Using filesort : 1 PRIMARY 討厭表 ref 學生ID 學生ID 3 t1.學生ID 1 : 2 DERIVED 基本資料 ALL NULL NULL NULL NULL 149433 Using filesort : 2 DERIVED 喜歡表 ref 學生ID 學生ID 3 基.學生ID 2 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.64.54.125

09/28 16:04, , 1F
這樣寫速度極慢,我看沒有回應就強制關掉了XD
09/28 16:04, 1F
文章代碼(AID): #1CdpxxrR (Database)
討論串 (同標題文章)
文章代碼(AID): #1CdpxxrR (Database)