2012-07-11 17 views
0

这可能有一个简单的解决方案,但我现在无法围绕它解决问题。MySQL中的逻辑运算符,建立了一组规则

我的表看起来像这样

|id|company_id|shift_type_id|user_id|date|create_at|updated_at|

我想列出属于一个特定的用户转移

SELECT * FROM shifts WHERE user_id = 1

然后让两个日期之间的选择

SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15'

排除是在周六和周日现在

SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15' and DAYNAME(date) != "Saturday" and DAYNAME(date) != "Sunday"

棘手的部分都转移(对我来说),在这一切之上,我想以排除周五和与特定shift_type_id轮班这种情况下6.我试图这样做

SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15' and DAYNAME(date) != "Saturday" and DAYNAME(date) != "Sunday" and (DAYNAME(date) != "Friday" and shift_type_id != 6)

这是不行的,我不明白为什么,我不知道如何解决这个问题。我见过一些解决方案,它们使用子查询并从主结果中排除结果,但我希望保持这种简单的构建方式,以便可以从一组规则中创建查询。

我在Rails3中的项目这样做的,这是什么样子

@user.work_hours.where('shifts.date between ? and ?', params[:start_date], params[:end_date]).where('DAYNAME(shifts.date) != "Sunday" and DAYNAME(shifts.date) != "Saturday" AND (DAYNAME(shifts.date) != "Friday" and shifts.shift_type_id != 6)')

回答

0

从你所说的话,你需要

SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15' and DAYNAME(date) != "Saturday" and DAYNAME(date) != "Sunday" and (DAYNAME(date) != "Friday" and shift_type_id = 6) 

具有换挡ID排除周五6,你的排除星期六,没有一个id为。

+0

谢谢你的回复托尼。我现在正在尝试此操作,但由于某种原因,此查询排除了shift_type_id为5的班次,并且在星期三。我的猜测是因为我只要求shift_type_id = 6,而不是将它与DAYNAME(日期)!=“星期五”分组。 – joakimpl 2012-07-11 14:39:15

+0

啊尝试和(不((DayName(日期)=“星期五”和shift_type_id = 6)) – 2012-07-11 15:47:02

+0

非常感谢托尼,工作。我认为查询的一部分必须分组,但我不知道它必须这样写。 – joakimpl 2012-07-12 07:34:32