Re: [SQL ] 多重欄位值序列或組合的複合搜尋
※ 引述《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
推
09/26 09:07, , 1F
09/26 09:07, 1F
討論串 (同標題文章)