Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте,
есть таблица
ID Cost Currency
------------------------------
1 1000 RUR
2 2000 EUR
3 1000 USD
4 2000 EUR
5 250 EUR
6 300 USD
...
Всего более 3000 записей.
Делаю постраничную навигацию по данной таблице с выдачей записей по 10 на странице. Сложность заключается в том, что выборка должна быть отсортирована по возрастанию цены с учетом пересчета курса валют (курс меняется). Поскольку записей более 3000, их приходится извлекать порциями. Только те, которые отображаются на странице. То есть LIMIT <начальный элемент>, 10. Без LIMIT я сортировку сделал (пример запроса):
SELECT * FROM Table WHERE ((Cost BETWEEN 0 AND 258400) AND Currency = 'RUR') OR ((Cost BETWEEN 0 AND 10000) AND Currency = 'USD') OR ((Cost BETWEEN 0 AND 7423) AND Currency = 'EUR') ORDER BY Cost. А потом сортируем уже внутри скрипта на PHP. Но видится мне это решение через одно место. Хотя работает. Но вот с добавлением LIMIT сортируются только значения внутри извлеченных 10 элементов. Без учета кросскурса.
Есть идеи, как сделать SELECT, чтобы учитывался кросскурс, и можно было извлекать порциями?
Неактивен
Вы выполняете сортировку в PHP, для этого Вам необходимо вытаскивать всю таблицу из базы. Если Вы хотите сортировку выпонять в MySQL, то введите курсы в запрос
SELECT ID, Cost, Currency, IF(Currency='RUR', Cost, IF(Currency='EUR', Cost*34.4, IF(Currency='USD', Cost*25.5, 'Unknown') ) ) rub_cost from table_name order bu rub_cost asc limit 10,20;
Неактивен
Спасибо, это то, о чем я хотел узнать
Неактивен
MySQL сначала выполняет ORDER BY, а затем LIMIT.
В Вашем случае ошибка возникает потому, что вы делаете сортировку с учетом кроскурса в PHP.
Вариант решения:
SELECT id, CASE currency when 'rur' then cost/25.84 when 'usd' then cost when 'eur' then cost/0.7423 END as cost_usd, currency FROM table_name ORDER BY cost_usd LIMIT 10,20;
Неактивен