2012-07-11 191 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