Сергей К.
1649 сообщений
#13 лет назад
Такая ситуация:
Есть таблица с полями price и valute
Нужно сделать сортировку по цене с учетом валюты.

Пример:
300 EUR
100 USD
200 UAH
400 UAH

При обычном ORDER BY price результат будет
100 USD
200 UAH
300 EUR
900 UAH
что не правильно, так как если конвертировать все в одну из валют, например в UAH, результат должен выглядеть так:
200 UAH - 200 гривен
100 USD - 800 гривен
900 UAH - 900 гривен
300 EUR - 3000 гривен

До выполнение запроса, все курсы есть в массиве(PHP).

Как лучше всего и с минимальными затратами ресурсов можно отсортировать?

ПС: Таблица большая, сортировка на уровне PHP не подходит, так как есть еще постраничная навигация и запрос возвращает только записи текущей страницы.
Роман Беляев
16382 сообщения
#13 лет назад
Курс хранится в записи с ценой? Цена что, так и хранится, строкой?
Сергей К.
1649 сообщений
#13 лет назад
Цитата ("frig"):
Курс хранится в записи с ценой? Цена что, так и хранится, строкой?

Конечно нет.
Я же писал Цитата ("WebDesignStudio"):
таблица с полями price и valute

price | valute
100 | USD
Роман Беляев
16382 сообщения
#13 лет назад
WebDesignStudio, не внимательно читал.
Храните рядом поле с курсом, при выборке перемножайте цену на курс и так сортируйте. Тогда будет привязка цены к курсу на момент добавления записи.
Можно сгородить огород с case в запросе и там подставлять курс - тогда итог будет зависеть от текущего курса.
Сергей К.
1649 сообщений
#13 лет назад
frig, Цитата ("frig"):
ри выборке перемножайте цену на курс и так сортируйте

не вариант. На данный момент в таблице больше 10 000 записей, а будет намного больше. При изменении курса, придется сделать UPDATE по всей таблице.
Роман Беляев
16382 сообщения
#13 лет назад
WebDesignStudio, еще раз перечитайте что я написал. Я предложил два варианта каждый из который реализует свое поведение. Надо с курсом на момент запроса - используйте второй вариант. Хотя наверняка есть что-то более логичное. Сильно вникать не хочется.
Сергей К.
1649 сообщений
#13 лет назад
frig, на счет второго варианта думаю, пришло в мыслях, но не знаю на сколько он хорош. Не пришлось на практике использовать.
Роман Беляев
16382 сообщения
#13 лет назад
WebDesignStudio, проблема проверить? Запилите запрос к вашей мегабазе и посмотрите что получится.
Сергей К.
1649 сообщений
#13 лет назад
frig, ну это я сделаю, но хотелось бы узнать может есть способы по лучше.
Роман Беляев
16382 сообщения
#13 лет назад
WebDesignStudio, все равно в запросе вычислять, если не хочется обновлять. Правильнее было бы конечно завести таблицу с валютами, а не городить курсы в массиве php.
Сергей К.
1649 сообщений
#13 лет назад
Цитата ("frig"):
WebDesignStudio, все равно в запросе вычислять, если не хочется обновлять. Правильнее было бы конечно завести таблицу с валютами, а не городить курсы в массиве php.

Курсы есть в БД, но немного иначе, не в отдельной таблице. Но если это поможет, такую таблицу завести могу. Какие идеи?
Роман Беляев
16382 сообщения
#13 лет назад
Цитата ("WebDesignStudio"):
Какие идеи?

Какие могут быть идеи, когда в одной таблице, а в другой таблице курс на который надо умножить значение из первой таблицы? :o
Владимир Ф.
1322 сообщения
#13 лет назад
Цитата ("WebDesignStudio"):
Как лучше всего и с минимальными затратами ресурсов можно отсортировать?

Цитата ("frig"):
Правильнее было бы конечно завести таблицу с валютами, а не городить курсы в массиве php.


Не это стоит заморочек с UDF.
Сергей К.
1649 сообщений
#13 лет назад
Выбрал способ
price*(IF(valute="USD",8,IF(valute="EUR",10,1))) AS priceABS
Вот результат, работает быстро вроде
Роман Беляев
16382 сообщения
#13 лет назад
WebDesignStudio, case гораздо лучше кучи вложенных if-ов
Сергей К.
1649 сообщений
#13 лет назад
Цитата ("vovan_f"):
Не это стоит заморочек с UDF.

это вы о чем?

Цитата ("frig"):
WebDesignStudio, case гораздо лучше кучи вложенных if-ов

ну смысл тот же
На самом деле там 3 валюты. Подумаю, может поменяю на CASE
Владимир Ф.
1322 сообщения
#13 лет назад
Цитата ("WebDesignStudio"):
Цитата ("vovan_f"):
Не это стоит заморочек с UDF.

это вы о чем?

Это я думаю быстрее чем пишу и слова местами неправильно ставлю.

А если про UDF то udf - user defined function
Евгений О.
2989 сообщений
#13 лет назад
Не въехал откуда курс берется, но думаю для сортировки надо что-то вроде такого запроса:

declare @u float
set @u = (select price from t where valute='UAH' limit 1)
select * from t order by price * (curs???) / @u
Сергей К.
1649 сообщений
#13 лет назад
Решил и сделал так
price*(CASE objects.valute WHEN 'uah' THEN 1, WHEN 'usd' THEN 7, WHEN 'eur' THEN 0.7 END) AS priceABS

Курсы передаются из переменных PHP.
Алексей Статюха
47 сообщений
#13 лет назад
WebDesignStudio,

Я бы в запросе умножал цену на курс из таблицы курсов (или таблицы валют или как оно у вас устроено) и в запросе бы сортировал. Что такое 10000 или 100000 записей для современных компов и БД? Если бы оказалось медленно - думал бы над оптимизацией запроса.
Но если вы уверены что пипл схавает - то наверное можно и так. Хотя я считаю что это не аккуратное решение т.к. при изменении соотношений курсов сортировка может оказаться не верной.