Re: [SQL ] 多重欄位值序列或組合的複合搜尋
不知道你手邊資料有多少, 試試看這樣子有沒有比較快
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
09/28 16:04, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):