[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Суммирование значения поля с переменной
AlmazDelDiablo
Всем привет.
Ребят, можно ли каким-нибудь образом суммровать данные из ячейки таблицы с внешней переменной прямо внутри запроса?
$query = $db->query( "REPLACE INTO `wc3_player_race` SET 
`player_id` = '
$uid',
`race_id` = '
$i',
`race_xp` = '
$xp'"
);

Вот в поле race_xp мне надо бы сделать суммирования переменной $xp и старого значения этого поля. Функция SUM судя по всему не подойдет.

Или же такое можно сделать, только вынув предварительно значение этой переменной, суммировать с $xp и в следующем запросе уже делать реплейс?



Спустя 4 минуты, 20 секунд (2.04.2011 - 15:40) alex12060 написал(а):

REPLACE INTO `wc3_player_race` SET
`player_id` = '$uid',
`race_id` = '$i',
`race_xp` = `rase_xp` + '$xp'"

Спустя 6 минут, 38 секунд (2.04.2011 - 15:47) AlmazDelDiablo написал(а):
Не работает. Всем ячейкам race_xp выставляется значение NULL.

Спустя 6 минут, 56 секунд (2.04.2011 - 15:54) alex12060 написал(а):
попробуй с UPDATE и без кавычек ``

Спустя 6 минут, 19 секунд (2.04.2011 - 16:00) AlmazDelDiablo написал(а):
С апдейтом работает, но он мне не подходит, так как пропускает несуществующие строки (а их надо создавать и заполнять).

Спустя 33 секунды (2.04.2011 - 16:01) Trianon написал(а):
Цитата
Вот в поле race_xp мне надо бы сделать суммирования переменной $xp и старого значения этого поля.


Для такого действия предназначен запрос UPDATE, а не REPLACE.

Если строки нужно создавать - применяйте запрос INSERT.

Спустя 8 минут, 1 секунда (2.04.2011 - 16:09) AlmazDelDiablo написал(а):
Цитата (Trianon @ 2.04.2011 - 17:01)
Цитата
Вот в поле race_xp мне надо бы сделать суммирования переменной $xp и старого значения этого поля.


Для такого действия предназначен запрос UPDATE, а не REPLACE.

Если строки нужно создавать - применяйте запрос INSERT.

Мне надо в одном запросе создавать новые строки, если их еще нет и заполнять новыми данными те, которые уже есть. А в этом случае UPDATE и INSERT пораждют ошибки, если сталкиваются с пустотой или существующей строкой соответственно. В этом случае мне подходит именно REPLACE.

Сейчас попробую что-нибудь изобрести с подзапросами. Если будут результаты — напишу.

Спустя 7 минут, 2 секунды (2.04.2011 - 16:16) Trianon написал(а):
Цитата
Мне надо в одном запросе создавать новые строки, если их еще нет и заполнять новыми данными те, которые уже есть. А в этом случае UPDATE и INSERT пораждют ошибки, если сталкиваются с пустотой или существующей строкой соответственно. В этом случае мне подходит именно REPLACE.


Вы бы слушали, что Вам говорят, а не спорили.
Слушали бы и читали мануал.

Не нужен Вам REPLACE.
REPLACE применяется для добавления строк (а в случае наличия дублей по уникальным ключам - для сплошной целиковой замены записи)

В случае сложной модификации при дублях в MySQL оптимально подходит именно оператор INSERT ( в его форме INSERT ... ON DUPLICATE KEY UPDATE )
Там можно сделать всё. Нужные поля поменять, подходящие - оставить, сложные - модифицировать с учетом как старого значения так и нового.
Как именно, я показал не так давно в этом посте.

Спустя 21 минута, 38 секунд (2.04.2011 - 16:38) AlmazDelDiablo написал(а):
Простите что спорю, но все равно не работает (или я что-то не так понял):
INSERT INTO `wc3_player_race` (`player_id`, `race_id`, `race_xp`)
VALUES('$uid', '$i', '$xp') ON DUPLICATE KEY UPDATE `race_xp` = race_xp + '$xp'

Выставляет всем race_xp = NULL, хотя в $xp содержится число 1124. пробовал делать без апострофов и с апострофами — результат один и тот же.

Спустя 33 минуты, 39 секунд (2.04.2011 - 17:11) Trianon написал(а):
А точную структуру таблицы нельзя привести (а заодно и строку, которая в ней уже есть)?

SHOW CREATE TABLE `wc3_player_race`;

А заодно и точный текст запроса, с уже подставленными значениями переменных?

Спустя 6 минут, 35 секунд (2.04.2011 - 17:18) AlmazDelDiablo написал(а):
CREATE TABLE `wc3_player_race` (
`player_id` int(8) unsigned NOT NULL default '0',
`race_id` tinyint(4) unsigned NOT NULL default '0',
`race_xp` int(8) default NULL,
PRIMARY KEY (`player_id`,`race_id`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251
INSERT INTO `wc3_player_race` (`player_id`, `race_id`, `race_xp`)
VALUES(7012, 10, 12345) ON DUPLICATE KEY UPDATE `race_xp` = race_xp + 12345

Спустя 1 час, 15 минут, 6 секунд (2.04.2011 - 18:33) AlmazDelDiablo написал(а):
Хм... если запись в базе уже есть — то удачно суммируются $xp и race_xp. Но если race_xp = NULL, то ничего не добавляется в race_xp.

Спустя 29 минут, 48 секунд (2.04.2011 - 19:03) Trianon написал(а):
Так ведь NULL означает неопределено, неизвестно

К неопределенному значению что ни добавляй, оно так и останется неопределенным.
Может ему не NULL, а 0 нужно задать в качестве умалчиваемого?

Спустя 4 минуты, 13 секунд (2.04.2011 - 19:07) AlmazDelDiablo написал(а):
Все, прошу прощения за тупость. Просто я пишу модуль к серверу, поэтому струкруту базы данных не имею права менять. Но вспомнил, что в есстественной ситуации в базе не бывает NULL (в моем условии), поэтому скрипт работает полноценно. Спасибо всем, кто помогал и еще раз прошу прощения за тупость.


_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.