Loading...
PHP/MySQL | Вопросы экспертам по MySQL
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

???

*CRAZY*

кури процедуры и функции
ps но мое мнение, что лучше средствами php


средствами php выходит мне нужно сначала определить массив юзера, потом сравнивая показатели сделать запись в БД

И ТЕПЕРЬ, чтобы мне вывести изменённые (самые свежие) данные, то мне нужно ПЕРЕОПРЕДЕЛИТЬ массив юзера

итого - имеем 3 запроса к БД + php

Используя триггеры или функцию, это все те же запросы, какая разница в каком виде они выполняются? у тебя все также будет select, update, select, ты просто наизвращаешься над решением простой задачи. если ты пишешь приложение на php, то и используй в полной мере его юзабилити. извращение с бд нужно делать не здесь.

upd 3 запроса к бд это не есть много для одной отправки, это ничтожно мало


просто хотелось бы попрактиковать с мускулом, для саморазвития так сказать
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));
Если я правильно понял.


так я и делаю, мне бы в запрос это условие воткнуть

у меня сейчас реген считает, но если переждать пока набежит больше чем максимальное хп, то запишет столько сколько набежало :-D
PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял *CRAZY*
TuT (10.01.2019 в 14:13)
PhpStorm, Как может записать больше, если у нас стоит условие? Что если больше hp_max, то пишем это значение?
Да и зачем в запрос вставлять данное условие? Это же нагрузка на сервер MySql, вообще не понял *CRAZY*


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


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

Так высчитаем сколько должно было набежать (ну чего там нам нужно) перезапишем с условием 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, если я правильно понял принцип действия Вашего скрипта)
И в целом я бы вынес это всё в какое-то более простое хранилище
Mobiaaa (10.01.2019 в 14:50)
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]);
Онлайн: 3
Время:
Gen. 0.1094
(c) Bym.Guru 2010-2025