2009-07-15 150 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 

但不知道你正在尝试做的我不知道。