作者danny0838 (道可道非常道)
看板Database
标题Re: [SQL ] 多重栏位值序列或组合的复合搜寻
时间Sun Sep 26 10:52:18 2010
: 表一:基本资料
: 表二:喜欢表
: 表三:讨厌表
: 学生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)