SearchEngines.bg

Това е примерно съобщение за гост. Регистрирайте безплатен акаунт днес, за да станете потребител на SearchEngines.bg! След като влезете, ще можете да участвате в този сайт, като добавите свои собствени теми и публикации, както и да се свържете с други членове чрез вашата лична входяща кутия! Благодарим ви!

MySQL - Използване на IF/Elseif и променливи?

fenixsz

New member
Здравейте,

Правя си едно сайтче, където ще се правят доста изчисления, но понеже съм си малко или много неук, се чудя как мога да оптимизирам тази заявка? Сега конскрукцията е доста проста - вложени IF-ове...


select if(((`main`.`ages` > 0) and (`main`.`ages` <= 1)),(`main`.`price` * `type`.`1_rate`),if(((`main`.`ages` > 0) and (`main`.`ages` <= 1)),(`main`.`price` * `type`.`1_rate`),if(((`main`.`ages` > 1) and (`main`.`ages` <= 2)),(`main`.`price` * `type`.`2_rate`),if(((`main`.`ages` > 2) and (`main`.`ages` <= 3)),(`main`.`price` * `type`.`3_rate`),if(((`main`.`ages` > 3) and (`main`.`ages` <= 4)),(`main`.`price` * `type`.`4_rate`),if(((`main`.`ages` > 4) and (`main`.`ages` <= 5)),(`main`.`price` * `type`.`5_rate`),if(((`main`.`ages` > 5) and (`main`.`ages` <= 6)),(`main`.`price` * `type`.`6_rate`),if(((`main`.`ages` > 6) and (`main`.`ages` <= 7)),0)))))))) AS `1_rate_value` from (`main` left join`type` on((`type`.`id` = `main`.`vehicle_type`)))

Идеята е да върне резултат, който е зависим от възрастта на автомобила. Тази заявка се повтаря няколко пъти, тъй като се показва в различни валути и в тази връзка може би е по-добре да се използва променлива както в PHP, ама нямам идея как :(

Пробвах няколко пъти да го направя, ама явно някъде бъркам.
 
Re: MySQL - Използване на IF/Elseif и променливи?

Аз поне с тия IF-ове не ти завиждам :)

По-скоро си направи една заявка, с която да изкараш необходимата информация и да обработиш с пхп:

PHP:
select m.ages, m.price, t.1_rate, t.2_rate, t.3_rate, t.4_rate, t.5_rate, t.6_rate from main m left join type t on t.id = m.vehicle_type;

И щом се вика на няколко места най-добре една функция да ти взема като асоциативен масив, ред от горната заявка и да прави тея if-ове

Edit: Другите варианти са да ползваш View-тата на mysql или да създадеш собствена функция в mysql коята да смята
 
Последно редактирано:
Re: MySQL - Използване на IF/Elseif и променливи?

Тези query-та ги слагам в View :) и решението трябва да е в MySQL view.
 
Re: MySQL - Използване на IF/Elseif и променливи?

коефициентите няма да е лошо да се извадят в отделна таблица
type_id - age_from - age_to - rate

Както е написал Будинов, с ПХП можеш да си го обработваш и да вадиш цената, която ти трябва, в сегашния вариант на базата

PHP:
	$query = '	SELECT m.ages, m.price, t.1_rate, t.2_rate, t.3_rate, t.4_rate, t.5_rate, t.6_rate 
			FROM main m LEFT JOIN type t ON t.id = m.vehicle_type';
	$result = mysql_query($query);
	$num_rows = mysql_num_rows($result);
	for ($i=0; $i < $num_rows; $i++) {
		$row = mysql_fetch_array($result);
		$ages = (float)$row['ages'];
		$price = (float)$row['price'];
		$rate1 = (float)$row['1_rate'];
		$rate2 = (float)$row['2_rate'];
		$rate3 = (float)$row['3_rate'];
		$rate4 = (float)$row['4_rate'];
		$rate5 = (float)$row['5_rate'];
		$rate6 = (float)$row['6_rate'];
		
		if (($ages > 6) && ($ages <= 7)) 
// С тази проверка изпускаш случая, когато ages > 7. Ако е грешка, нека е това:			
//		if ($ages > 6) 
			$final_price = 0;
		else if ($ages > 5)
			$final_price = $price * $rate6;
		else if ($ages > 4)
			$final_price = $price * $rate5;
		else if ($ages > 3)
			$final_price = $price * $rate4;
		else if ($ages > 2)
			$final_price = $price * $rate3;
		else if ($ages > 1)
			$final_price = $price * $rate2;
		else
			$final_price = $price * $rate1;

		echo $final_price;
	}
 
Re: MySQL - Използване на IF/Elseif и променливи?

@KOBRETI

Благодаря за старанието!!! (Не разбрах дали ти дадох репутация) Работата е, че го правя с Joomla и разширенията Fabrikar и Community Builder.

Доста съм лимитиран откъм възможности и в момента мога единствено да си оптимизирам MySQL View-ите върху, които се базират таблиците и графиките.

Ще мисля върху по-сериозни оптимизации, ако има перспектива.
 
Re: MySQL - Използване на IF/Elseif и променливи?

За да достигнеш до подобно положение или не можеш да променяш базата или не си я структурирал правилно за да работи за теб, а не ти за нея?
 
Re: MySQL - Използване на IF/Elseif и променливи?

Еми, ти питаше за PHP и ти написах PHP :)

С джумла не съм работил...

Питах за MySQL :)

За да достигнеш до подобно положение или не можеш да променяш базата или не си я структурирал правилно за да работи за теб, а не ти за нея?

Логиката на базата съм си я правил аз. Аз съм финансист и може би нещо ми куца, но имам следния казус:

Имам 12 различни индекса за всяка отделна година, за всеки модел автомобил:

Примерно някакво БМВ:

1. 20%
2. 15%
3. 18%
4. 13%
5. 20%
6. 15%
7. 18%
8. 13%
9. 14%
10. 15%
11. 17%
12. 18%

Трябва да получа резултат, който да съответства на старостта на автомобила. Смятам обезценка на автомобила за 3 години.

Първи резултат:
1. Цена * (индекс съответстващ на годините на автомобила)

Втори резултат

2. (Цена - Резултат първи) * (индекс съответстващ на годината + 1)

Трети резултат

3. (Цена - резултат първи - резултат втори) * (индекс съответстващ на годината + 2)


За конкретния случай ми трябват 2 таблици:

1. Основно инфо - тип автомобил, модел, възраст, цена на придобиване и т.н. - добавя го потребителя
2. Инфо за моделите - всеки модел с индивидуални индекси за обезценка - база от мен

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

Edit: Отговор на моя въпрос в следващия пост
 
Последно редактирано:
Re: MySQL - Използване на IF/Elseif и променливи?

Таблицата за коефициентите трябва да е така:
koef_id - type_id - age_from - age_to - rate

Иначе базата ти не е нормализирана достатъчно за целите ти и затова е мъка със заявките. В този вариант заявката става елементарна без if-ове

Демек, коефициентите вместо да ги слагаш на 1 ред в таблицата, ги разбий на по един ред за всеки от тях
 
Re: MySQL - Използване на IF/Elseif и променливи?

Таблицата за коефициентите трябва да е така:
koef_id - type_id - age_from - age_to - rate

Иначе базата ти не е нормализирана достатъчно за целите ти и затова е мъка със заявките. В този вариант заявката става елементарна без if-ове

Демек, коефициентите вместо да ги слагаш на 1 ред в таблицата, ги разбий на по един ред за всеки от тях

Накара ме да се замисля, въпреки, че не ми се отдава много :)


Ммм, ще трябва да сложа 3 колони с 3-те ставки - за годината в покупка, за следващата и за по-следващата и ще стане :)

Не мога да ти дам репутация, защото явно съм ти давал скоро...
 
Re: MySQL - Използване на IF/Elseif и променливи?

май не ме разбра...

ид - тип - години_от - години_до - коефициент
1 - 1 - 0 - 1 - 20
2 - 1 - 1 - 2 - 15
3 - 1 - 2 - 3 - 18
4 - 1 - 3 - 4 - 13
5 - 1 - 4 - 5 - 20
........

Това са примерните данни от таблицата, която ти си написал. @-та колонка е еднаква, защото данните са за един тип автомобил в този случай
 
Re: MySQL - Използване на IF/Elseif и променливи?

май не ме разбра...

ид - типид - години_от - години_до - коефициент
1 - 1 - 0 - 1 - 20
2 - 1 - 1 - 2 - 15
3 - 1 - 2 - 3 - 18
4 - 1 - 3 - 4 - 13
5 - 1 - 4 - 5 - 20
........

Това са примерните данни от таблицата, която ти си написал. @-та колонка е еднаква, защото данните са за един тип автомобил в този случай

Абе, май аз не се изразявам както трябва.

За да свържа записите трябва да направя join по типид where години_автомб > години_от и години_автомб =< години_до.

По този начин ще имам само един ред с една ставка, което е и идеята де, а мен ми трябват за следващите три години (което не бях описал в началото).

Таа, ето така ще изглежда финално, според това, което ми подсказа:


ид - тип - години_от - години_до - коефициент - коефициент_2ра - коефициент_3та
1 - 1 - 0 - 1 - 20 - 15 - 18
2 - 1 - 1 - 2 - 15 - 18 - 13
3 - 1 - 2 - 3 - 18 - 13 - 20
4 - 1 - 3 - 4 - 13 - 20 -....
5 - 1 - 4 - 5 - 20 - ... -...
........
 
Последно редактирано:
Re: MySQL - Използване на IF/Elseif и променливи?

Ако искаш да сложиш проверка и връщане на mapped value, спрямо известен параметър можеш да използваш:

Код:
SELECT 
    CASE 1 
        WHEN 1 THEN 'edno' 
	WHEN 2 THEN 'dve' 
    END;

където първата единица ще ти е известния параметър. ;D
 

Горе