我不知道我是否遗漏了一些非常明显的东西,但是我一直在这个查询中出现语法错误。即使我错过了一些明显的东西,我想知道是否有更明智的方式来获得我所追求的。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