帮助编写基于条件的mysql查询

帮助编写基于条件的mysql查询,mysql,Mysql,我正试图基于if语句编写一个MySQL语句 下面是我想要做的:我需要查询来根据一个项目是否将在两周内到期或者是否已经过期来收集行 这就是我到目前为止所做的: select t_id, firstName, lastName, checkTime, due from (checkOut join People) where checkOut.p_id = People.p_id order by due IF(DATE(NOW()-checkOut.due) <= 2

我正试图基于if语句编写一个MySQL语句

下面是我想要做的:我需要查询来根据一个项目是否将在两周内到期或者是否已经过期来收集行

这就是我到目前为止所做的:

select
  t_id,
  firstName, 
  lastName, 
  checkTime,
  due
from (checkOut join People)
where checkOut.p_id = People.p_id
order by due IF(DATE(NOW()-checkOut.due) <= 2 WEEK);
MySQL表示IF语句附近有语法错误,我并不感到惊讶,因为我不熟悉在MySQL中编写条件语句

另一个问题是关于MySQL是否会产生一个负数的日期,即表示某个项目已到期。提前感谢。

如果您有IF,则无法使用它。一种可移植的替代方法是,在ORDER BY中放置一个CASE,在条件匹配的地方分配一个0,在条件不匹配的地方分配一个排序在0之后的1

select
  t_id,
  firstName, 
  lastName, 
  checkTime,
  due
from 
  checkOut 
  join People ON checkOut.p_id = People.p_id
order by 
  /* Use DATE_SUB() */
  /* This will sort those not yet past due ahead of those already past due. 
     If this is the opposite of what you want, switch the 0 and 1 */
  CASE WHEN DATE_SUB(CURDATE(), INTERVAL 2 WEEK) <= checkOut.due THEN 0 ELSE 1 END;

请注意,我已将WHERE子句更改为ON子句,从而将隐式联接转换为显式联接。

我想您要查找的是

SELECT t_id, 
       firstname, 
       lastname, 
       checktime, 
       due 
FROM   checkout 
       JOIN people 
         ON checkout.p_id = people.p_id 
ORDER  BY CASE 
            WHEN ( Now() - INTERVAL 2 week ) <= checkout.due THEN 0 
            ELSE 1 
          END, 
          due 

是否要同时选择已过期和未过期?是。我的目标是选择将在两周内到期的值以及那些已到期的值。这听起来很奇怪,但在我使用它的方式上是有道理的。我相信这就是我所寻找的答案。在这种情况下,是否可以获得一个负日期,MySQL会将其解释为小于checkout.due?没有负日期的概念。如图所示。在这种情况下,MySQL将如何处理该事件?使用日期算法。现在查看此条件-间隔2周on子句的理由是什么?这是一个非常基本的问题,但我是MySQL新手。在这个查询的另一个变体中,如果没有ON,它工作得很好。@user1675246如果没有ON子句,您将得到两个表的笛卡尔乘积。例如,如果关系是一对多,那么最终的行数将远远超过预期。即使没有它也可以工作,强烈建议显式包含连接条件。@user1675246抱歉-我刚刚注意到您的WHERE子句中有连接条件。这是隐式连接和显式via-JOIN关键字的奇怪组合。最好使用上面提到的连接语法;那我就换吧。看起来不错,但我不得不取消订单。谢谢