2015-02-10 2 views
2

Я полностью разбираюсь в PHP IF() и ELSEIF(). Однако сегодня я начал работать с командами MySQL, у меня длинный запрос MySQL, и я не понимаю, как я его модифицирую.Проблемы с пониманием MySQL IF() и ELSE()

Вот код:

$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"; 

Что мне нужно сделать, это создать оператор ELSE, если p.delivery равен '2', и добавьте следующий код:

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 
} 

Но я просто не могу понять логику изменения моего статута. Может быть, мой мозг устал, потому что сегодня я узнал о нормализации. Может ли кто-нибудь помочь мне здесь, спасибо.

EDIT: Я провел весь день, очищая MySQL, результат которого выше, основываясь на том, что я до сих пор узнал о MySQL.

Тем не менее, теперь я хотел бы переписать это с использованием case, основываясь на полезных комментариях, которые я получил. У меня есть 5 таких запросов MySQL на моей странице, и мне интересно, может ли кто-то быть достаточно любезен, чтобы переписать выше в формате case, тогда я могу использовать это, чтобы переписать другие запросы? Спасибо.

+0

Первое, что нужно реализовать: sql не является языком программирования. Поэтому лучше всего было бы даже не пытаться применять к нему императивные идиомы программирования. – zerkms

+2

Преобразование заявления в 'case'. , , это будет иметь больший смысл. –

+0

Хорошо, мне нужно будет нормализовать мою базу данных, если я хочу, чтобы это сработало. Мне глупо хранить материал в виде массива в ячейке таблицы. Я уезжаю в ODesk, чтобы нанять кого-то, поскольку эта работа слишком сложна для меня, я знаю свои пределы. Но спасибо всем за заботу/Luke –

ответ

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.

Вам придется включить это в остальную часть вашего запроса, так как вы оставили часть этого.

+0

, все еще пытающийся интегрировать это в мой код, я буду продолжать попытки, но спасибо за вклад. Я расскажу вам завтра о моем прогрессе. –

+0

ok, так что мой вопрос обновлен @ shawnt00, но не повезло с кодом, вы можете увидеть, что я, возможно, сделал не так? Сначала я проверяю оператор case на исходный код. Спасибо. –

+0

Вам больше не понадобится никакое из 'IF()'. Но я не уверен, о чем идет речь в целом. Является ли это списком столбцов, созданных как часть более крупного запроса? – shawnt00