Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> ON DUPLICATE KEY UPDATE CASE
123456  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 894
Пользователь №: 30352
На форуме: 5 лет, 4 месяца, 18 дней
Карма: 13




Есть таблица для хранения балансов пользователя

CREATE TABLE `balance` (
`id_user` mediumint(8) unsigned NOT NULL,
`id_cur` tinyint(3) unsigned NOT NULL,
`num` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `balance`
ADD UNIQUE KEY `id_user` (`id_user`,`id_cur`);


В id_cur хранится номер валюты. В num - значение.



И есть функция для изменения балансов.


		function balanceUpdate($array)
{
$arr = [];

foreach ($array as $k => $v)
{
$arr[0][] = '('. $this->id_user .', '. $k .', '. $v .')';
$arr[1][] = 'WHEN '. $k .' THEN `num` + '. $v;
}


DB::q("
INSERT INTO `balance` (`id_user`, `id_cur`, `num`) VALUES "
. implode(', ' $arr[0]) ."
ON DUPLICATE KEY UPDATE `num` = CASE `id_cur` "
. implode(' ' $arr[1]) ." END"
);

if (DB::affected_rows() != count($array))
exit('Error Class Balance Affected Row #1');

}


$this->id_user - id пользователя
Может у кого есть какие мысли как улучшить этот кусок кода(в том числе и сам запрос)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 371
Пользователь №: 40589
На форуме: 2 года, 3 месяца, 20 дней
Карма: 22




а что в $array передаете?
мне почему то кажется, что весь ваш код можно заменить грамотным sql-запросом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
123456  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 894
Пользователь №: 30352
На форуме: 5 лет, 4 месяца, 18 дней
Карма: 13




массив вида номер валюты => на сколько изменить

пример:
array(
1 => -3,
7 => 9,
11 => -11
)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 7 месяцев, 11 дней
Карма: 13




123456, не пробовали на систему мульти валюты смотреть под другим углом.
Например:
1. таблицу balance оставляем в том же виде. Только в поле `num` значение не меняется, а допустим храниться в баксах.
2. Создаем таблицу
CREATE TABLE `curs` (
`id` mediumint(8) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`coff` mediumint(8) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

В ней у нас хранятся курсы валют, с коэффициентом относительно бакса.

Собственно при смене валюты, по сути меняется только ID в balance в табличке `id_cur` и все.
Вычисление при получении суммы в нужной валюте делаем при выборке. Вычисления не сложные, но если кешировать результат, то нагрузки заметно не будет вообще.

П.С. Описал несколько сумбурно, надеюсь смог донести мысль.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 371
Пользователь №: 40589
На форуме: 2 года, 3 месяца, 20 дней
Карма: 22




у нас в компании у клиента может быть несколько счетов, в зависимости от того, в какой валюте он пополнял. а это может быть и евро и доллар и рубль. клиенту потом не объяснишь, почему у него было 100 долларов, а потом стало 90.
мне кажется, у автора подобная ситуация.

автор, как вы получаете этот массив. зачем такие сложные расчеты? знать бы побольше инфы. вроде архитектуры базы. у вас слишком сложно сейчас сделано. одновременно при odku используете case when. обычно эти две вещи всегда исключают друг друга в использовании.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 5 дней
Карма: 170




Цитата (icedfox @ 14.03.2016 - 16:30)
Вычисление при получении суммы в нужной валюте делаем при выборке. Вычисления не сложные, но если кешировать результат, то нагрузки заметно не будет вообще.

я бы не советовал этого делать


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 7 месяцев, 11 дней
Карма: 13




Цитата (Valick @ 14.03.2016 - 20:17)
я бы не советовал этого делать

Готов выслушать развернутое объяснение вашему совету, если оно действительно будет полезно, буду очень признателен.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 5 дней
Карма: 170




icedfox, в базе один миллион рублёвых пользователей, изменился курс валюты, надо обновить один миллион баксовых записей, достаточно развёрнуто?
Да и depp, вам уже намекнул, что при постоянном переводе валют туда сюда обратно, вы можете недосчитаться деньжат, готовы платить неустойки?


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 7 месяцев, 11 дней
Карма: 13




Цитата (Valick @ 14.03.2016 - 20:39)
icedfox, в базе один миллион рублёвых пользователей

Очень сомневаюсь, что весь миллион пользователей зайдет в панель за один раз. Или вы хотите перестраивать кеш сразу весь ? Не проще его создавать по мере обращения ?
Цитата (Valick @ 14.03.2016 - 20:39)
при постоянном переводе валют туда сюда обратно, вы можете недосчитаться деньжат, готовы платить неустойки?

Если есть несколько разных одновременно валют, то это определенной сложности, но вполне решаемо. В таблице у ТС я не увидел это, один вид вылюты и все. Решается на раз буквально.
Цитата (Valick @ 14.03.2016 - 20:39)
при постоянном переводе валют туда сюда обратно, вы можете недосчитаться деньжат

Ну тут же тоже все просто, валюта внутри системы единая (пусть баксы). При смене валюты у юзера меняется (визуально) не только его баланс но и цены на продукты системы. Поэтому хоть 100500 раз он пускай меняет текущую валюту и при этом пополняет баланс , по факту он получит ровно столько, сколько положил.

Говорю не голословно. У меня на одном проекте именно такой подход более 5 лет, полет нормальный.

PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
123456  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 894
Пользователь №: 30352
На форуме: 5 лет, 4 месяца, 18 дней
Карма: 13




Цитата
В ней у нас хранятся курсы валют, с коэффициентом относительно бакса.

Валюты никак не относятся друг к другу. Могут вообще быть валюты не в виде USD/EUR/RUB//и т.д.


Цитата
автор, как вы получаете этот массив. зачем такие сложные расчеты? знать бы побольше инфы.


Пишу класс для создания и управления Балансами пользователей.
Данный класс планирую использовать сразу в нескольких проектах.

1 проект строительной тематики.

Компании регистрируются и указывают сколько у кого имеется материалов (кирпичи, доски, и т.д.), после выполнения определенных действий, со счета компании должно сняться определенное количество материалов(к примеру 3 кирпича и 7 досок) и добавиться к примеру 2 ед. плитки.


Так и формируется массив, что-то отнимаем а что-то прибавляем.

Описал кратко. Думаю смысл понятен .


И да, тип валюты описывается в отдельной таблице, а id_cur - это ключ из этой таблицы.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 5 дней
Карма: 170




icedfox, по мере обращения говорите, тогда давайте на пальцах...

я кладу 1000 рублей по курсу 75 рублей за доллар это
13.3333333333 долларов которые мы пишем в БД
через день курс изменился на 73 рубля
распишите дальнейшие действия


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 7 месяцев, 11 дней
Карма: 13




Вы клиент, у вас панели есть информация.
Текущий курс валюты: 1$ = 75 рублей
Ваш баланс 0 рублей.
Цена поплавка 56 рублей.

Вы кладете на баланс 75 рублей
Текущий курс валюты: 1$ = 75 рублей
Ваш баланс 75 рублей.
Цена поплавка 56 рублей.

Меняется курс валюты на следующий день
Текущий курс валюты: 1$ = 73 рубля
Ваш баланс 73 рубля.
Цена поплавка 54,52 рубля.

Вы покупаете поплавок ровно за столько, сколько и положили на баланс, ничего не теряя (75 рублей).
Я продал поплавок ровно за столько, сколько он у меня и стоит (1$).

PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 371
Пользователь №: 40589
На форуме: 2 года, 3 месяца, 20 дней
Карма: 22




icedfox
где два рубля? спросит клиент и будет прав.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
icedfox  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 395
Пользователь №: 41702
На форуме: 1 год, 7 месяцев, 11 дней
Карма: 13




Цитата (depp @ 15.03.2016 - 00:39)
где два рубля? спросит клиент и будет прав.

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

Поэтому есть два пути, вы можете извернуться с кодом и придумать головняк себе и клиентам, а можете опереться на опыт других и решив данную задачу, заниматься спокойно другими полезными вещами.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5593
Пользователь №: 35718
На форуме: 4 года, 4 месяца, 5 дней
Карма: 170




icedfox, если я положил 75 рублей, то я хочу видеть эти 75 рублей у себя в личном кабинете вне зависимости от курса доллара.
вы просто привязали свой товар к доллару и сразу конвертируете любую валюту в доллары, лихие 90-тые камбэк


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса