作者danny0838 (道可道非常道)
看板Database
标题Re: [SQL ] 多重栏位值序列或组合的复合搜寻
时间Sun Sep 26 01:44:26 2010
※ 引述《ThreeDay0905 (三天)》之铭言:
: : 1.所有符合志愿大学含有(包括以上)2个台大,1个阳明,1个长庚的学生
: 比较简单做法是先把学生ID跟志愿大学做GROUP
: 接着筛选出 COUNT(志愿科系) > 条件的资料
: 接着在做判断,比较笨的做法就是把这些筛选出来的资料
: 把三个都符合的学生资料捞出来
: SQL语法像是
: ===========================================================
: SELECT * FROM
: (
: SELECT 学生ID FROM 资料表 GROUP BY 学生ID, 志愿大学
: HAVING (志愿大学 = '台大' AND COUNT(志愿科系) >= 2) or
: (志愿大学 = '阳明' AND COUNT(志愿科系) >= 1) or
: (志愿大学 = '长庚' AND COUNT(志愿科系) >= 1)
: ) as tempTb
: GROUP BY tempTb.学生ID HAVING COUNT(学生ID) >= 3
: ============================================================
MSSQL不懂,sorry..
: 应该有更好的做法,这两个做法都是BY CASE去做
: 扩充性跟弹性都不足
: 仅止於参考
感谢提供idea,不过还是希望有更美的做法
(如果二个问题不能一起解决就没法Work..QQ)
: : 2.所有符合志愿大学按志愿序排列含有 台大-台大-长庚-阳明 的学生
: 这个CASE必须表示必须要考虑到顺序 ?
是的,如范例所述,只要从前到後有 台大-台大-长庚-阳明 就符合
***
类似的功能,我参考的某个系统大致是这样做的:
(这系统不考虑「志愿科系」)
学生ID 志愿序 志愿组
-----------------------------------------------------------
1 阳明,台大,台大...,长庚 台大,长庚,阳明,...
2 台大,... 台大,...
志愿组是把志愿序的所有项目按照一定的X规则(eg.内码)重新排序
要做到功能2,就:
CONCAT(',',志愿序,',') LIKE '%,台大,%,台大,%,阳明,%长庚,%'
功能1就先丢进X规则排序,再用 LIKE。
这样可以 Work,但这种 schema 太乱,维护不易,
加上 LIKE 无法使用索引,效率较差,
是以想请教是否有正规化 schema 的实作方法。
***
顺便问一个延伸的问题:
表一:基本资料
学生ID 姓名
---------------------------------
1 王大明
2 菜阿信
表二:喜欢表
学生ID 喜欢
---------------------------------
1 吃饭
1 打枪
1 上网
2 看书
2 电影
2 漫画
表三:讨厌表
学生ID 讨厌
---------------------------------
1 小强
1 蚂蚁
1 读书
2 芝麻
2 青蛙
学生ID是primary key,要如何输出成如下格式:
学生ID 姓名 喜欢 讨厌
------------------------------------------------------
1 王大明 吃饭,打枪,上网 小强,蚂蚁,读书
2 菜阿信 看书,电影,漫画 芝麻,青蛙
就是把正规化 schema 转置成该系统的样式,
如果能成功也许可配合 temp table 或 view 实作?
不知这样效率会怎样...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.115.123.83
1F:推 evernever:你可以看一下 group_concat 怎麽用 09/26 09:07