Re: [SQL ] 多重欄位值序列或組合的複合搜尋
: 表一:基本資料
: 表二:喜歡表
: 表三:討厭表
: 學生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: 58.115.123.83
※ 編輯: danny0838 來自: 58.115.123.83 (09/26 10:56)
討論串 (同標題文章)