作者evernever (NeverEver)
看板Database
标题Re: [SQL ] 多重栏位值序列或组合的复合搜寻
时间Sun Sep 26 20:39:21 2010
不知道你手边资料有多少, 试试看这样子有没有比较快
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
1F:推 danny0838:这样写速度极慢,我看没有回应就强制关掉了XD 09/28 16:04