Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нестандартная выборка из MySQL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
vladokzzz
Отправлено: 27 Марта, 2015 - 12:01:49
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




Добрый день!
Пока не смог найти решение для своей задачи, поэтому пишу сюда.
Имеется база с таблицей items и currency
В items забиты товары с ценой (столбцы id, name, price и currency_id)
В currency курсы валют (id,name,num)
id=1 name=рубль num=1
id=2 name=доллар num=60

В items у каждого товара своя цена, НО с учетом выбранной валюты, т.е. к примеру
id=1 name=Корзина price=300 currency_id=1
id=2 name=Тазик price=10 currency_id=2

В итоге имеем Корзину за 300*1 = 300 рублей и тазик за 10*60=600 рублей
Необходимо вывести все товары по возрастанию цены. Если делать через ORDER by price, то первым выведется Тазик, т.к. у него price 10, но цена указана в долларах, а по факту он дороже корзины, которая стоит 300 рублей.

Голову не окончательно еще сломал, но уже кипит, как сделать выборку и сортировку не делая кучу обращений к базе, т.к. товаров может быть более 10 000.
 
 Top
LIME
Отправлено: 27 Марта, 2015 - 12:23:54
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT items.* FROM items
  2. JOIN currency ON items.currency_id = currency.id
  3. ORDER BY items.price * currency.num

(Добавление)
но лучше хранить уже подсчитанную цену
можно дополнительным полем
в случае смены валюты пересчитывать
 
 Top
vladokzzz
Отправлено: 27 Марта, 2015 - 12:59:39
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




[quote=LIME][/quote]
Динамики хотелось Улыбка Что бы не пересчитывать постоянно

JOIN не понимает сервер похоже
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN currency ON items.currency_id = currency.id' at line 1
 
 Top
LIME
Отправлено: 27 Марта, 2015 - 13:03:32
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




не может сервер не понимать
это ты гдето накосячил при составлении строки запроса
vladokzzz пишет:
Динамики хотелось
вот и пересчитывай цену динамически
можешь триггер написать
зато выборка будет гораздо быстрей и проще
(Добавление)
Цитата:
near 'JOIN currency ON items.currency_id = currency.id' at line 1
не смущает что это первая строка запроса?
 
 Top
vladokzzz
Отправлено: 27 Марта, 2015 - 13:40:12
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




LIME пишет:
не может сервер не понимать
это ты гдето накосячил при составлении строки запроса
vladokzzz пишет:
Динамики хотелось
вот и пересчитывай цену динамически
можешь триггер написать
зато выборка будет гораздо быстрей и проще
(Добавление)
Цитата:
near 'JOIN currency ON items.currency_id = currency.id' at line 1
не смущает что это первая строка запроса?


Спасибо за помощь, почитаю подробнее про функцию JOIN.
Справился с задачей обычным SELECT из нескольких таблиц с помощью условий WHERE. Запрос объемный вышел, но все работает и с одного обращения к базе.
Да, и спасибо за условие items.price * currency.num. Не знал, что здесь можно формулой задавать выборку.
 
 Top
lastdays
Отправлено: 27 Марта, 2015 - 21:58:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




Логику нужно изменять, что бы в будущем проблем не было.

Держите в базе всегда одну валюту, например в рублях и флаг валюты.
Если флаг "требует" - конвертируйте валюту php скриптом в любую другую, позволит легко манипулировать курсом валют, не лазая постоянно в бд и не менять цены на тысячные товары.


PHP:
скопировать код в буфер обмена
  1.  
  2. //- Курс валют:
  3. $CursArray = array( 'USD' => "66.98", // 1 Доллар = 66,98 рублей России
  4.                     'EUR' => "76",    // 1 Евро = 76 рублей России
  5.                     'UAH' => "2.71",  // 1 Гривна = 2,71 рубля России
  6.                     'RUB' => "1"      // -------
  7.                   );
  8.  
  9. //- Конвертируем
  10. function convertor($val,$curs)
  11. {
  12.  global $CursArray;
  13.  return round(($val / $CursArray[$curs]),2);
  14. }
  15.  
  16. //-
  17. print('Хочу в USD: '.convertor(5000,'USD'));
  18. print('<br />');
  19. print('Хочу в EUR: '.convertor(5000,'EUR'));
  20. print('<br />');
  21. print('Хочу в RUB: '.convertor(5000,'RUB'));
  22.  

(Отредактировано автором: 27 Марта, 2015 - 22:30:00)

 
 Top
Faraon-san
Отправлено: 27 Марта, 2015 - 22:23:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




Про LEFT забыли
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT items.* FROM items
  2. LEFT JOIN currency ON items.currency_id = currency.id
  3. ORDER BY items.price * currency.num
 
 Top
Sail
Отправлено: 27 Марта, 2015 - 23:59:59
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Faraon-san пишет:
Про LEFT забыли

А для чего он? Опасаетесь, что найдётся item с отсутствующей в справочнике валютой? Хммм...
 
 Top
vladokzzz
Отправлено: 28 Марта, 2015 - 06:16:53
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2015  


Помог: 0 раз(а)




lastdays пишет:
Логику нужно изменять, что бы в будущем проблем не было.

Держите в базе всегда одну валюту, например в рублях и флаг валюты.
Если флаг "требует" - конвертируйте валюту php скриптом в любую другую, позволит легко манипулировать курсом валют, не лазая постоянно в бд и не менять цены на тысячные товары.


PHP:
скопировать код в буфер обмена
  1.  
  2. //- Курс валют:
  3. $CursArray = array( 'USD' => "66.98", // 1 Доллар = 66,98 рублей России
  4.                     'EUR' => "76",    // 1 Евро = 76 рублей России
  5.                     'UAH' => "2.71",  // 1 Гривна = 2,71 рубля России
  6.                     'RUB' => "1"      // -------
  7.                   );
  8.  
  9. //- Конвертируем
  10. function convertor($val,$curs)
  11. {
  12.  global $CursArray;
  13.  return round(($val / $CursArray[$curs]),2);
  14. }
  15.  
  16. //-
  17. print('Хочу в USD: '.convertor(5000,'USD'));
  18. print('<br />');
  19. print('Хочу в EUR: '.convertor(5000,'EUR'));
  20. print('<br />');
  21. print('Хочу в RUB: '.convertor(5000,'RUB'));
  22.  


Тоже интересное решение. Спасибо.
А еще можно выгрузить из базы валюты и поместить в массив, а потом уже брать из него нужную.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB