遇到问题需要了解MySQL IF()和ELSE()

时间:2015-02-10 00:47:14

标签: php mysql

我完全可以使用PHP IF()和ELSEIF()。然而今天我开始使用MySQL命令,我有一个很长的MySQL查询,我无法理解我如何修改它。

以下是代码:

$db->colums[] = "
IF(
    (SELECT
        IF(p.delivery = '1',IF(distance < deliverymilesto1, deliverysurcharge1,
            IF (distance < deliverymilesto2, deliverysurcharge2,
                IF (distance < deliverymilesto3, deliverysurcharge3,
                    IF (distance < deliverymilesto4, deliverysurcharge4, 
                        IF(distance < deliverymilesto5,deliverysurcharge5,0)
                    )
                )
            )
        ), 0)
        FROM products prod WHERE prod.id_product = p.id_product
    ) > 0,
    (p.price +  (SELECT
        IF(p.delivery = '1',IF(distance < deliverymilesto1, deliverysurcharge1,
            IF (distance < deliverymilesto2, deliverysurcharge2,
                IF (distance < deliverymilesto3, deliverysurcharge3,
                    IF (distance < deliverymilesto4, deliverysurcharge4, 
                        IF(distance < deliverymilesto5,deliverysurcharge5,0)
                         )
                     )
                 )
             ), 0)
             FROM products prod WHERE prod.id_product = p.id_product
        )),
    (p.price)
)as pricedelivery";

如果p.delivery等于&#39; 2&#39;,我需要做的是创建一个ELSE语句,并添加以下代码:

IF(p.delivery = '2', IF(find_in_set('".$outcoder."', deliveryoutcode1), deliveryoutcharge1,
IF(find_in_set('".$outcoder."', deliveryoutcode2), deliveryoutcharge1, deliveryoutcharge2, 0)), 0)

在PHP中,这很简单:

if($delivery = '1') {
...code here
} elseif($delivery = '2') {
...otherwise
}

但我无法理解如何更改我的声明的逻辑。也许我的大脑已经累了,因为我今天一直在学习正常化。任何人都可以帮助我,谢谢。

编辑:基于我迄今为止所学到的关于MySQL的知识,我整个上午花了整整一段时间来清理MySQL,其结果高于上面。

但是,我现在希望能够根据我收到的有用评论,使用case重写此内容。我在我的页面上有5个这样的MySQL查询,我想知道是否有人能够以case格式重写上述内容,然后我可以用它来重写其他查询?谢谢。

1 个答案:

答案 0 :(得分:2)

SELECT
  price +
  case delivery
      when '1' then
          case
              when distance < deliverymilesto1 then deliverysurcharge1
              when distance < deliverymilesto2 then deliverysurcharge2
              when distance < deliverymilesto3 then deliverysurcharge3
              when distance < deliverymilesto4 then deliverysurcharge4
              when distance < deliverymilesto5 then deliverysurcharge5
              else 0   
          end
      when '2' then
          case
              when distance < deliverymilesto1 then deliveryoutcharge1
              when distance < deliverymilesto2 then deliveryoutcharge2
              when distance < deliverymilesto3 then deliveryoutcharge3
              when distance < deliverymilesto4 then deliveryoutcharge4
              when distance < deliverymilesto5 then deliveryoutcharge5
              else 0   
          end
      else 0
  end
FROM products

IF()功能与您习惯的分支不同。第一个参数是一个条件,第二个参数是当条件计算结果为true时返回的内容,第三个参数是相反的情况,它是假的。

上面的代码只是在第三个参数(else分支)中使用了很多嵌套来完成你通常使用IF ... ELSE ...或等同于CASE表达式的内容

您必须将其纳入查询的其余部分,因为您已将其中一部分删除。