我不知道我是否遺漏了一些非常明顯的東西,但是我一直在這個查詢中出現語法錯誤。即使我錯過了一些明顯的東西,我想知道是否有更明智的方式來獲得我所追求的。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
)
在閱讀了幾次查詢之後,我不得不承認,似乎你可能正在做一些不需要的日期數學,你可以讓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
如果我剛剛使用WEEKDAY(shift_start)0和4之間,是不是會返回所有星期一和星期五之間的班次(幾乎都是這些班次)?也許我錯過了你的建議。儘管如此,我很欣賞這些反饋。它非常多毛,看起來像MySQL可以在沒有我的長版本的情況下做的事情。 – Anthony 2009-07-15 07:43:31