2015-08-18 419 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相同的答案。或者你创建一个字段来存储按位运算符的日子,只需要一个表。 –

相关问题