Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql使用if-else-in-where子句获取条件记录_Php_Mysql_Sql - Fatal编程技术网

Php MySql使用if-else-in-where子句获取条件记录

Php MySql使用if-else-in-where子句获取条件记录,php,mysql,sql,Php,Mysql,Sql,在我的站点中,我必须存储两种类型的交货日期合同交货日期和订单的调整交货日期。基本上,合同日期是订单接收时产品的交货日期。调整日期是调整日期,可以小于或大于合同日期 下表如下: id product_name condeldat adjdeldate ---------------------------------------- 1 drilling 2011-05 2012-01 2 lathe 2012-06 我必须检查是否有任何产品有

在我的站点中,我必须存储两种类型的交货日期合同交货日期和订单的调整交货日期。基本上,合同日期是订单接收时产品的交货日期。调整日期是调整日期,可以小于或大于合同日期

下表如下:

id   product_name  condeldat adjdeldate
----------------------------------------
1     drilling      2011-05    2012-01
2     lathe         2012-06
我必须检查是否有任何产品有调整日期,然后选择调整日期或合同日期

完成以下查询:

select id,
       product_name,
       if(adjdeldat is not NULL, adjdeldat, condeldat) as delivery_date     
 from orders

上面的查询很好,但我必须得到去年(现在是2011年)任何交货日期的产品(如果(adjdelcat不为NULL,adjdeldat,CondentDat))>。所以我的问题是如何在where子句中应用相同的if条件?

您需要使用
使条件等价于

请尝试以下内容:

SELECT id,product_name,if(adjdeldat is not NULL,adjdeldat,condeldat) as delivery_date 
FROM orders  
WHERE ((adjdeldat is NULL and left(condeldat) > 2011) OR left(adjdeldat) > 2011)
要动态获取去年数据,您可以使用:

(left(curdate(),4)-1) in place of 2011

使用以下表达式:

 select id, product_name,
 if(adjdeldat is not NULL, adjdeldat, condeldat) as delivery_date     
 from orders  HAVING delivery_date BETWEEN 'beginDate' AND 'endDate'

使用派生表/内联视图:

SELECT x.id, x.product_name, x.delivery_date  
  FROM (SELECT o.id, o.product_name, IFNULL(o.adjdeldat, o.condeldat) AS delivery_date
          FROM ORDERS o) x
 WHERE x.delivery_date BETWEEN '2011-01-01' AND '2011-12-31' 
  • 您可以用ANSI
    COALESCE
    或CASE语句替换IFNULL
  • 始终比较具有相同数据类型的值,否则,如果存在索引,则查询无法使用索引
  • 根据操作的不同,优化器可能会使用谓词推送(在本例中不太可能)将外部查询的过滤推送到内部查询中

你真的理解力很强。这正是我想要的。非常感谢翠鸟