0

我不确定我是否遗漏了一些非常明显的东西,但我在这个查询中不断收到语法错误。即使我遗漏了一些明显的东西,我也想知道是否有更聪明的方法来获得我想要的东西。

基本上,该查询询问与 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 传递给它)。


很棒的工作,本鲁米。这是有效的:

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
    )
4

2 回答 2

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)

我做过的两件事

  • 使它看起来像一个普通的查询,据我所知,from 和 where 不能进入 if 内部。
  • 在if里面放一个条件,不要以为mysql会自动取0为假,>0为真。
于 2009-07-15T06:48:01.960 回答
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

但是在不知道您要做什么的情况下,我不确定。

于 2009-07-15T06:50:55.153 回答