2015-08-18 523 views
1

所以現在我在學校類的表中有一個名爲days的列,其中包含特定部分將運行的日期,如'TR'將在週二和週四運行, 'MWF'將在週一,週三和週五運行。Postgresql檢查字符串中是否包含很多字母

我希望用戶能夠過濾它的運行天數,所以如果一個類運行3次, MT,MW,TF我希望用戶能夠輸入MTW,並獲得第2個。但是,唯一的辦法,我可以找出如何正確地查詢它,是使輸入字符串的所有可能性的數組,因此MTW將成爲M,T,W,MT,MW,TW,MWT,只是看看是否有天陣列。它的工作原理,但我想知道是否有更好的方法。

+0

採取複合索引的優點是歸一化/改變分貝結構的可能性? – FuzzyTree

+1

是的,它仍在大力發展。你會建議什麼 –

回答

3

我建議創建另一個表,class_days,其中包含每天一類將運行。

所以MWT存儲在days而是將被存儲爲3行中單獨的表

class_days 
class_id, day 
1,M 
1,W 
1,T 

然後你可以使用not exists選擇不已安排了一天班沒有一個給定的類用戶(因此所有的類都被賦予天預定)

select c.id from classes c 
where not exists (
    select 1 from class_days cd 
    where cd.class_id = c.id 
    and cd.day not in ('M','W','T') 
) 

上面的查詢假設在每一行210在class_days中至少有1個相應的行。如果情況並非如此,請添加exists條件以確保您不返回沒有任何日期設置的課程。

select c.id from classes c 
where not exists (
    select 1 from class_days cd 
    where cd.class_id = c.id 
    and cd.day not in ('M','W','T') 
) and exists (
    select 1 from class_days cd 
    where cd.class_id = c.id 
) 

這些查詢可以在class_days(class_id,day)

+0

嗯,我試圖避免有另一張桌子。你認爲速度會如何與我現在的做法相比?因爲現在我將擁有另一個表格,其行數比我的班級表格多兩倍 –

+0

@TomerShemesh帶有'class_id','day'上的複合索引,額外的表格運行速度要比檢索所有類別的查詢快得多在特定天數上給出 – FuzzyTree

+0

好的。如果在課堂上還有我的日子專欄,這樣做是不好的做法,以至於當我只是按名稱查找課程時,我不需要進行加入來了解哪些日子是什麼? –

0

您需要三張表


  • 的classid 主鍵


  • 大衛·主鍵

  • ClassDay
    的ClassID Foreing重點
    大衛·Foreing重點

UPDATE

或者你可以使用位運算符

比方說,星期一= 1,星期二= 2,Wensday = 4,星期四= 8,星期五= 16

如果用戶想要MTW。

您更新類

UPDATE Class 
SET DAY = 1 + 2 + 4 

和搜索

SELECT * 
FROM Class 
WHERE 
    DAY & 1 
AND DAY & 2 
ADN DAY & 4 
+0

@TomerShemesh我認爲第三張桌子是要走的路,但我增加了按比例的解決方案供您考慮。 –

+0

我不明白爲什麼我需要3桌,當我想我只需要兩個如上所示 –

+0

是的,你可以跳過DAYS表爲你的情況。我只是給你一般規格表。但與Fuzzy相同的答案。或者你創建一個字段來存儲按位運算符的日子,只需要一個表。 –

相關問題