|
|
|
| здравствуйте! помогите решить проблему...
Нужно сделать сортировку по цене, но проблема в том что на выход идет совсем другая цена не та что базе, а с учётом всех скидок, накидок и курсов....
вот функция которая выдает выходную цену
<?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_price, 2);
}
//вычисляем коэфицент накидки
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_price, 2);
//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 ;
|
| |
|
|
|
|
|
|
|
для: sav
(15.04.2008 в 21:44)
| | самое лучшее, что вы можете сделать - добавить в таблицу поле out_price_with_discount. Которое будет содержать цену с учётом всех скидок и курсов
И сортировать по этому полю. | |
|
|
|
|
|
|
|
для: Хулиган
(15.04.2008 в 21:56)
| | я все таки подожду более безболезненые предложения))) но это то же идея.. | |
|
|
|
|
|
|
|
для: 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");
}
|
| |
|
|
|
|
|
|
|
для: Хулиган
(15.04.2008 в 23:58)
| | нт в этом нет проблем... проблема в том что нужно будет очень многое менять в движке.... | |
|
|
|
|
|
|
|
для: sav
(15.04.2008 в 21:44)
| | ну помогите пожалуйста!!!
неужеле нет решения этой проблемы?? | |
|
|
|
|
|
|
|
для: sav
(16.04.2008 в 20:16)
| | я не понял что надо сделать, есть цена в базе, а расчётная цена куда попадает - в результаты запроса или затирает цену (price)?
по какому полю надо сделать сортировку?
чёто я туплю | |
|
|
|
|
|
|
|
для: ronin80
(17.04.2008 в 08:41)
| | есть цена price.. делается поиск и выходят позиции товаров... цена этих товаров расчитывается с помощью функции приведенной в первом посте т.е. учитываются курсы валют скидки накидки и т.д. нужна сортировка именно по прощитанной цене а не по цене которая в базе...
сделать еще поле не удобно т.к. в базе находится около 10 млн. записей... | |
|
|
|
|
|
|
|
для: sav
(17.04.2008 в 13:56)
| | Если оптимизировать таблицу не получается, можно попробовать так:
Выполнить запрос, и положить данные запроса в массив.
Если вы извлекаете из БД например значения 5 полей, то сделайте массив из 6 полей.
5 полей массива заполняете непосредственно данными из БД, а шестое поле заполняете ценой, рассчитанной исходя из имеющихся у вас данных, курса, наценок и т.п.
А когда весь массив будет сформирован. сортируйте этот массив по шестому полю.
Т.е. вынесите процесс сортировки из запроса и выполняйте сортировку после получения и рассчёта всех данных. | |
|
|
|