2009-07-15 148 views
0

我不知道我是否遺漏了一些非常明顯的東西,但是我一直在這個查詢中出現語法錯誤。即使我錯過了一些明顯的東西,我想知道是否有更明智的方式來獲得我所追求的。MySQL條件查詢裏面的條款

基本上,查詢會在週一到週五之間詢問任何與start_date綁定的用戶行。這很好。但是後來我添加了一個條件查詢,以防該星期六或星期日有任何行。需要注意的是條件查詢檢查與週六或週日,而不是用戶在主查詢的任何用戶:

SELECT user_id, 
DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') date, 
TIME_FORMAT(TIME(shift_start), '%h:%i %p') start, 
TIME_FORMAT(TIME(shift_end), '%h:%i %p') end, 
title 
FROM shifts 
WHERE user_id = '$user_id' 
AND DATE(shift_start) BETWEEN 
DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) AND 
DATE_ADD(DATE(NOW()), INTERVAL 
    (SELECT 
    IF( 
    COUNT(*) FROM shifts 
    WHERE DATE(shift_start) BETWEEN 
    DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND 
    DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY), 
6, 4)) - WEEKDAY(NOW()) DAY) 
ORDER BY shift_start 

我其實感到相當自豪的它如何工作,與IF部分弄亂之前,但再一次,如果有這樣一個明顯更好的方式,我全都是耳朵。

噢,當這個問題得到解決時,「Now()」將被設置在php腳本中的日期變量(通過GET傳遞給它)替換。


很棒的工作,benlumey。這裏是什麼工作:

SELECT user_id, 
     DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') AS shift_start_date, 
     TIME_FORMAT(TIME(shift_start), '%h:%i %p') AS shift_start_time, 
     TIME_FORMAT(TIME(shift_end), '%h:%i %p') AS shift_end_time, 
     title 
FROM shifts 
WHERE user_id = '$user_id' AND 
DATE(shift_start) BETWEEN 
    DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) 
    AND 
    DATE_ADD 
    (
     DATE(NOW()), INTERVAL 
     (
     SELECT IF(COUNT(*),6,4) 
     FROM shifts 
     WHERE DATE(shift_start) BETWEEN 
      DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) 
      AND 
      DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY) 
     ) - WEEKDAY(NOW()) DAY 
    ) 
+0

在閱讀了幾次查詢之後,我不得不承認,似乎你可能正在做一些不需要的日期數學,你可以讓MySQL爲你做,雖然也許這是我缺乏理解。你能簡化DATE(shift_start) DATE_SUB(DATE(NOW()),INTERVAL WEEKDAY(NOW())DAY)和...「到」WEEKDAY(shift_start)BETWEEN 1 AND ...「嗎? – ruquay 2009-07-15 06:48:11

+0

如果我剛剛使用WEEKDAY(shift_start)0和4之間,是不是會返回所有星期一和星期五之間的班次(幾乎都是這些班次)?也許我錯過了你的建議。儘管如此,我很欣賞這些反饋。它非常多毛,看起來像MySQL可以在沒有我的長版本的情況下做的事情。 – Anthony 2009-07-15 07:43:31

回答

2

試試這個子查詢:

(SELECT 
    IF(COUNT(*) > 0, 6, 4)) - WEEKDAY(NOW()) DAY) 
    FROM shifts 
    WHERE DATE(shift_start) BETWEEN 
    DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND 
    DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY) 

兩件事情我已經做了

  • 使它看起來像一個正常的查詢中,從哪裏不能去如果據我所知,就在裏面。
  • 把一個條件放在if中,不要以爲mysql會自動將0作爲false並且> 0作爲true。
+0

如果從(並且)哪裏不能進入if(),那真的會讓人失望,但是會解釋一切!至於你的第二點,0作爲false正是[if語句] [1]所做的,這就是我渴望使用它的原因。 [1]:[http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if] – Anthony 2009-07-15 07:48:21

1

這個分崩離析在這裏:

(SELECT 
    IF( 
     COUNT(*) FROM shifts 
    WHERE DATE(shift_start) BETWEEN 

計數聲明將無法工作。

你想做什麼?你需要清楚說明你在這裏完成的任務。

這是我的贓物吧:

(SELECT 
    IF( 
     (select COUNT(*) FROM shifts 
     WHERE DATE(shift_start) BETWEEN 
     DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND 
     DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY))>0,6,4) 
) - WEEKDAY(NOW()) DAY 

但不知道你正在嘗試做的我不知道。