PHP/MySQL | Вопросы экспертам по MySQL

DELETED
Автор
10 января 2019, в 14:07
Delete
Dizzy221 (10.01.2019 в 13:57)
PhpStorm (10.01.2019 в 13:31)
Dizzy221 (10.01.2019 в 13:25)
2. Как в этот запрос засунуть условие:
ЕСЛИ
hp + (unix_timestamp(now()) - hp_up) / 12
БОЛЬШЕ
hp_max
ТО
hp = hp_max
???
кури процедуры и функции
ps но мое мнение, что лучше средствами php
средствами php выходит мне нужно сначала определить массив юзера, потом сравнивая показатели сделать запись в БД
И ТЕПЕРЬ, чтобы мне вывести изменённые (самые свежие) данные, то мне нужно ПЕРЕОПРЕДЕЛИТЬ массив юзера
итого - имеем 3 запроса к БД + php
Используя триггеры или функцию, это все те же запросы, какая разница в каком виде они выполняются? у тебя все также будет select, update, select, ты просто наизвращаешься над решением простой задачи. если ты пишешь приложение на php, то и используй в полной мере его юзабилити. извращение с бд нужно делать не здесь.
upd 3 запроса к бд это не есть много для одной отправки, это ничтожно мало
PhpStorm (10.01.2019 в 13:31)
Dizzy221 (10.01.2019 в 13:25)
2. Как в этот запрос засунуть условие:
ЕСЛИ
hp + (unix_timestamp(now()) - hp_up) / 12
БОЛЬШЕ
hp_max
ТО
hp = hp_max
???

кури процедуры и функции
ps но мое мнение, что лучше средствами php
средствами php выходит мне нужно сначала определить массив юзера, потом сравнивая показатели сделать запись в БД
И ТЕПЕРЬ, чтобы мне вывести изменённые (самые свежие) данные, то мне нужно ПЕРЕОПРЕДЕЛИТЬ массив юзера
итого - имеем 3 запроса к БД + php
Используя триггеры или функцию, это все те же запросы, какая разница в каком виде они выполняются? у тебя все также будет select, update, select, ты просто наизвращаешься над решением простой задачи. если ты пишешь приложение на php, то и используй в полной мере его юзабилити. извращение с бд нужно делать не здесь.
upd 3 запроса к бд это не есть много для одной отправки, это ничтожно мало
просто хотелось бы попрактиковать с мускулом, для саморазвития так сказать

DELETED
Автор
10 января 2019, в 14:10
Delete
TuT (10.01.2019 в 14:05)
PhpStorm (10.01.2019 в 14:04)
TuT (10.01.2019 в 13:56)
PhpStorm (10.01.2019 в 13:42)
Сибирский (10.01.2019 в 13:36)
PhpStorm, из класса, в классе они всегда будут свежие.
1 берём данные - 5
2 изменяем данные - 5+1
3 выводим - 5
4 переопределяем данные и выводим - 6
от этого никуда не деться
А не проще формулу в PHP расписать? И полученные данные вывести и перезаписать?
1 Берем данные 5
2 Изменяем данные 5+1 (где 1 полученное число по формуле)
3 Выведем данные из формулы 6
4 Перезапишем данные.
и получается, что юзеру вывели то, что он набрал необходимый опыт для повышения уровня, но повышение уровня в базу записали потом и сам повышенный уровень будет виден только после обновления вывода
проще сразу выводить данные и на их основании строить логику
Вот типа этого
$hp = ((hp + (unix_timestamp(now()) - hp_up) / 12) > hp_max ? hp_max : (hp + (unix_timestamp(now()) - hp_up) / 12));
Если я правильно понял.
PhpStorm (10.01.2019 в 14:04)
TuT (10.01.2019 в 13:56)
PhpStorm (10.01.2019 в 13:42)
Сибирский (10.01.2019 в 13:36)
PhpStorm, из класса, в классе они всегда будут свежие.
1 берём данные - 5
2 изменяем данные - 5+1
3 выводим - 5
4 переопределяем данные и выводим - 6
от этого никуда не деться
А не проще формулу в PHP расписать? И полученные данные вывести и перезаписать?
1 Берем данные 5
2 Изменяем данные 5+1 (где 1 полученное число по формуле)
3 Выведем данные из формулы 6
4 Перезапишем данные.
и получается, что юзеру вывели то, что он набрал необходимый опыт для повышения уровня, но повышение уровня в базу записали потом и сам повышенный уровень будет виден только после обновления вывода
проще сразу выводить данные и на их основании строить логику
Вот типа этого
$hp = ((hp + (unix_timestamp(now()) - hp_up) / 12) > hp_max ? hp_max : (hp + (unix_timestamp(now()) - hp_up) / 12));
Если я правильно понял.
так я и делаю, мне бы в запрос это условие воткнуть
у меня сейчас реген считает, но если переждать пока набежит больше чем максимальное хп, то запишет столько сколько набежало

PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял


DELETED
Автор
10 января 2019, в 14:16
Delete
TuT (10.01.2019 в 14:13)
PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял
PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял

во время обновления данных hp ещё не прибавилось с учётом прошедшего времени потому что, поэтому условие where hp < hp_max сработает и будет добавлен весь набежавший реген, например за год, поэтому нужно дополнительное условие, если хп больше максимального, то пишем ему значение максимального

________
посл. ред. 10.01.2019 в 14:17; всего 1 раз(а); by PhpStorm
PhpStorm (10.01.2019 в 14:16)
TuT (10.01.2019 в 14:13)
PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял
во время обновления данных hp ещё не прибавилось с учётом прошедшего времени потому что, поэтому условие where hp < hp_max сработает и будет добавлен весь набежавший реген, например за год, поэтому нужно дополнительное условие, если хп больше максимального, то пишем ему значение максимального
TuT (10.01.2019 в 14:13)
PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял

во время обновления данных hp ещё не прибавилось с учётом прошедшего времени потому что, поэтому условие where hp < hp_max сработает и будет добавлен весь набежавший реген, например за год, поэтому нужно дополнительное условие, если хп больше максимального, то пишем ему значение максимального

Так высчитаем сколько должно было набежать (ну чего там нам нужно) перезапишем с условием where
<?
$hp = ((hp + (unix_timestamp(now()) - hp_up) / 12) > hp_max ? hp_max : (hp + (unix_timestamp(now()) - hp_up) / 12));//высчитаем
MySQL::run('update users set hp = $hp, hp_up = unix_timestamp(now()) where $hp < hp_max and (unix_timestamp(now()) - hp_up) / 12 >= 1 and id = ? limit 1', [UID]);
PhpStorm, Вынесите логику работы max_hp в приложение
Вы в любом случае при расчётах (боя, или что там у Вас) будете получать ХП пользователя, вместе с ХП и max_xp берите
Минус условие
туда же, хп (реген) рассчитывать в момент использования данных (минусуя бесполезный постоянный UPDATE, если я правильно понял принцип действия Вашего скрипта)
И в целом я бы вынес это всё в какое-то более простое хранилище
Вы в любом случае при расчётах (боя, или что там у Вас) будете получать ХП пользователя, вместе с ХП и max_xp берите
Минус условие
туда же, хп (реген) рассчитывать в момент использования данных (минусуя бесполезный постоянный UPDATE, если я правильно понял принцип действия Вашего скрипта)
И в целом я бы вынес это всё в какое-то более простое хранилище

DELETED
Автор
10 января 2019, в 16:06
Delete
Mobiaaa (10.01.2019 в 14:50)
PhpStorm, Вынесите логику работы max_hp в приложение
Вы в любом случае при расчётах (боя, или что там у Вас) будете получать ХП пользователя, вместе с ХП и max_xp берите
Минус условие
туда же, хп (реген) рассчитывать в момент использования данных (минусуя бесполезный постоянный UPDATE, если я правильно понял принцип действия Вашего скрипта)
И в целом я бы вынес это всё в какое-то более простое хранилище
PhpStorm, Вынесите логику работы max_hp в приложение
Вы в любом случае при расчётах (боя, или что там у Вас) будете получать ХП пользователя, вместе с ХП и max_xp берите
Минус условие
туда же, хп (реген) рассчитывать в момент использования данных (минусуя бесполезный постоянный UPDATE, если я правильно понял принцип действия Вашего скрипта)
И в целом я бы вынес это всё в какое-то более простое хранилище
Дима, я остановился пока что на таком решении
<?php
MySQL::run('update users set hp = case when (hp + (unix_timestamp() - hp_up) / 10) > hp_max then hp_max else hp + (unix_timestamp() - hp_up) / 10 end, hp_up = unix_timestamp() where hp < hp_max and (unix_timestamp() - hp_up) / 10 >= 1 and id = ? limit 1', [UID]);