MySQL条件查询里面的where子句

时间:2009-07-15 06:35:53

标签: php mysql nested conditional aggregate

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

基本上,查询要求在星期一和星期五之间绑定到具有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
    )

2 个答案:

答案 0 :(得分: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中放入一个条件,不要认为mysql会自动将0视为false,将> 0视为true。

答案 1 :(得分:1)

这在这里崩溃了:

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

count语句不起作用。

你想做什么?您需要明确说明您要在这里完成的任务。

这是我的唠叨:

 (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

但不知道你想做什么,我不确定。