Cортировка по цене, если вывод цены подлежит определенной логике

Alexos

Новичок
Cортировка по цене, если вывод цены подлежит определенной логике

Задача сделать на сайте сортировку по цене.

В таблице есть следующие поля относящиеся к ценообразованию на выходе:

price_in decimal(10,2) - цена закупки товара
percent_out decimal(10,2) - наша наценка на товар
percent_discount decimal(10,2) - скидка на товар
price_fixed decimal(10,2) - фиксированная цена (если значение задано, то первые два поля игнорируются)


Каким образом можно сделать сортировку по цене, если вывод цены подлежит следующей логике:

PHP:
<?
// Задана/не задана фиксированная цена
if($price_fixed != '0') $price = $price_fixed;
else $price = (($price_in * $percent_out) / 100) + $price_in;

// Если выводить в долларах:
if (CurrencyRus=='0') {

   // Если скидка на товар не задана
   if ($percent_discount=='0') $out = number_format($price, "2", ".", " ")."\$";

   // Если задана
   if ($percent_discount!='0') {

       $discountless = $price;
       $discount = $discountless - (($discountless * $percent_discount) / 100);

       $out = "<del>".number_format($discountless, "2", ".", " ")."\$</del>&nbsp;&nbsp;".
           "<font color=\"FF0000\">".number_format($discount, "2", ".", " ")."\$</font>";

   }// if

} // if

// Если выводить в рублях:
if (CurrencyRus=='1') {

   // Если скидка на товар не задана
   if ($percent_discount=='0') $out = round($price * CurrencyRate)." руб.";

   // Если задана
   if ($percent_discount!='0') {

       $discountless = $price;
       $discount = $discountless - (($discountless * $percent_discount) / 100);

       $out = "<del>".round($discountless * CurrencyRate)." руб.</del>&nbsp;&nbsp;".
           "<font color=\"FF0000\">".round($discount * CurrencyRate)." руб.</font>";

   }// if

} // if

?>

<p><?=$out?></p>

Можно ли это как то уложить в запрос и избавиться от пхп-кода и сделать сортировку по цене?
 

neko

tеam neko
чето я непойму какая связь между форматированием html с ценой которое ты тут делаешь и сортировкой.

тебе надо просто написать расчет, либо задана фикс. цена либо ты перемножаешь цену, наценку и процент скидки.
это делается арифм. операторами и конструкцией IF или CASE
по результату отсортировать.

выводить цвет и перевести в другую валюту можно после.
 

Wicked

Новичок
можно. В mysql тоже есть операторы +, -, *, /, if, функции concat(), format(), round().

но я бы серьезно задумался над отделением представления, безотносительно переноса вычислений на сторону mysql.
 

neko

tеam neko
примерно так:

Код:
ORDER BY IFNULL(price_fixed, (percent_out / 100 + 1.0) * price_in) * (- percent_discount / 100 + 1.0)
я только не очень в курсе что там в mysql с типами и не потеряем ли мы decimal где-то при таких расчетах.
 

Trianon

Новичок
PHP:
SELECT
  good_name, 
  COALESCE(price_fixed), 
          price_in 
          *(1+percent_out/100)
          *(1-percent_discount/100)
   ) as price 
FROM goods
ORDER BY price ASC
 

Alexos

Новичок
ну html я просто показал, чтоб была видна общая логика..


тебе надо просто написать расчет, либо задана фикс. цена либо ты перемножаешь цену, наценку и процент скидки.
это делается арифм. операторами и конструкцией IF или CASE
по результату отсортировать.
Вот я и не могу написать такой запрос.. Никогда не писал запросов с такой конструкцией.. Напиши PLZ запрос, я проанализирую, пойму как работает, и больше спрашивать не буду..

зы. на фиксированную цену тоже может начисляться скидка
 

neko

tеam neko
это кстати неправильно, у него там не NULL, а ноль
так что ни та ни другая неподходят. :)

-~{}~ 15.06.07 19:14:

вот так будет правильно:

Код:
ORDER BY IF(price_fixed, price_fixed, (percent_out / 100 + 1.0) * price_in) * (- percent_discount / 100 + 1.0)
ну или, еще правильнее все-же там сделать NULL.
 

Alexos

Новичок
опа! сколько ответов! прощёлкал :) окно поста висело долго, не обновлял :)
спасибо большое! буду разбираться..
 

Trianon

Новичок
Автор оригинала: neko
это кстати неправильно, у него там не NULL, а ноль
так что ни та ни другая неподходят. :)
фиксированная цена (если значение задано )

Незаданное значение в таблице спокон веку было NULL
 

Alexos

Новичок
фиксированная цена (если значение задано )

Незаданное значение в таблице спокон веку было NULL
Угу.. неправильно в коментах написал.. сорри..
у меня там не NULL, а ноль :) по пхп-коду видно :)

neko
Разобрался! Всё гут.. Только на фиксированную цену тоже может начисляться скидка.. Т.е. при заполненном поле price_fixed, поле percent_discount тоже может содержать истину. Твоя сортировка не учитывает этого.
Вот теперь ума не приложу как это тут ввинтить.. чё то я уже совсем заморочился под конец дня :((( HELP!!!
 

neko

tеam neko
вообще-то учитывает.
посмотри внимательно.

сначала выбирается либо фиксированная, либо производная от закупки и наценки.
потом уже от нее расчитывается конечная, с учетом скидки.
 

Alexos

Новичок
neko
:)))))) Точно :) В скобках запутался:) Всё! Пойду в повара :))))
Чё то крыша едит уже.. Хватит работать.. Пойду ка лучше попью пивка :)

СПАСИБО
 
Сверху