Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сложная сортировка
 
 автор: sav   (15.04.2008 в 21:44)   письмо автору
 
 

здравствуйте! помогите решить проблему...

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

вот функция которая выдает выходную цену

<?php
function price($admin$price$rate=1$supp_dis$currency=1$percent='0.00'$discount='0.00')
{
    
//вычисляем курс
    
if($rate != '0.00')
    {
        
$ret_price $price $rate;//[цена] * [курс]
    
}
    else {
$ret_price $price;}
    
//вычисляем скидку поставщика
    
if($supp_dis != '0.00') {$ret_price $ret_price - ($ret_price * ($supp_dis 100));}//[цена] -[скидка поставщика]
    //если это админ возвращаем цену
    
if($admin)
    {
        
$ret_price $ret_price $currency;
        return 
round($ret_price2);
    }
    
//вычисляем коэфицент накидки
    
if($percent != '0.00') {$ret_price $ret_price + ($ret_price * ($percent  100));}//[цена] + [коэфицент надбавки] 
    //вычисляем скидку клиента
    
if($discount != '0.00') {$ret_price $ret_price - ($ret_price * ($discount 100));}//[цена] - [скидка клиента]

    
$ret_price $ret_price $currency;
    
    return 
round($ret_price2);
    
//return ceil($ret_price);
}
?>


объяснения полей

price - цена
percent - процент накидки
rate - курс
supp_dis - скидка поставщика
discount - скидка клиента(хранится в сессии клиента)



вот структура таблицы


CREATE TABLE IF NOT EXISTS `part_goods` (
  `good_id` mediumint(8) NOT NULL auto_increment,
  `code` varchar(30) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `price` decimal(10,2) NOT NULL default '0.00',
  `percent` decimal(10,2) NOT NULL default '0.00',
  `rate` decimal(10,2) NOT NULL default '0.00',
  `supp_dis` decimal(10,2) NOT NULL default '0.00',
  `maker` varchar(30) NOT NULL default '',
  `mark` varchar(255) NOT NULL default '',
  `weight` varchar(15) NOT NULL default '',
  `w_pice` varchar(15) NOT NULL default '',
  `supp_id` mediumint(8) NOT NULL default '0',
  `supp_name` varchar(50) NOT NULL default '',
  `term` varchar(15) NOT NULL default '',
  `presence` varchar(15) NOT NULL default '',
  `note` varchar(255) NOT NULL default '',
  `price_id` mediumint(8) NOT NULL default '0',
  `up_date` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`good_id`),
  KEY `code` (`code`),
  KEY `price_id` (`price_id`),
  KEY `supp_id` (`supp_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=124771 ;

   
 
 автор: Хулиган   (15.04.2008 в 21:56)   письмо автору
 
   для: sav   (15.04.2008 в 21:44)
 

самое лучшее, что вы можете сделать - добавить в таблицу поле out_price_with_discount. Которое будет содержать цену с учётом всех скидок и курсов
И сортировать по этому полю.

   
 
 автор: sav   (15.04.2008 в 22:54)   письмо автору
 
   для: Хулиган   (15.04.2008 в 21:56)
 

я все таки подожду более безболезненые предложения))) но это то же идея..

   
 
 автор: Хулиган   (15.04.2008 в 23:58)   письмо автору
 
   для: sav   (15.04.2008 в 22:54)
 

А что тут болезненного ?
Решается в одну минуту:

mysql_query("ALTER TABLE `part_goods` ADD `out_price` FLOAT NOT NULL");

$res = mysql_query("SELECT * FROM `part_goods`");
while ( $prod = mysql_fetch_assoc($res) ){
    $out_price = price (.......);
    $good_id = $prod['good_id'];
    mysql_query("UPDATE `part_goods` SET out_price = '$out_price' WHERE good_id = $good_id");
}

   
 
 автор: sav   (16.04.2008 в 01:12)   письмо автору
 
   для: Хулиган   (15.04.2008 в 23:58)
 

нт в этом нет проблем... проблема в том что нужно будет очень многое менять в движке....

   
 
 автор: sav   (16.04.2008 в 20:16)   письмо автору
 
   для: sav   (15.04.2008 в 21:44)
 

ну помогите пожалуйста!!!
неужеле нет решения этой проблемы??

   
 
 автор: ronin80   (17.04.2008 в 08:41)   письмо автору
 
   для: sav   (16.04.2008 в 20:16)
 

я не понял что надо сделать, есть цена в базе, а расчётная цена куда попадает - в результаты запроса или затирает цену (price)?

по какому полю надо сделать сортировку?

чёто я туплю

   
 
 автор: sav   (17.04.2008 в 13:56)   письмо автору
 
   для: ronin80   (17.04.2008 в 08:41)
 

есть цена price.. делается поиск и выходят позиции товаров... цена этих товаров расчитывается с помощью функции приведенной в первом посте т.е. учитываются курсы валют скидки накидки и т.д. нужна сортировка именно по прощитанной цене а не по цене которая в базе...
сделать еще поле не удобно т.к. в базе находится около 10 млн. записей...

   
 
 автор: Хулиган   (17.04.2008 в 18:00)   письмо автору
 
   для: sav   (17.04.2008 в 13:56)
 

Если оптимизировать таблицу не получается, можно попробовать так:
Выполнить запрос, и положить данные запроса в массив.
Если вы извлекаете из БД например значения 5 полей, то сделайте массив из 6 полей.
5 полей массива заполняете непосредственно данными из БД, а шестое поле заполняете ценой, рассчитанной исходя из имеющихся у вас данных, курса, наценок и т.п.
А когда весь массив будет сформирован. сортируйте этот массив по шестому полю.
Т.е. вынесите процесс сортировки из запроса и выполняйте сортировку после получения и рассчёта всех данных.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования