如何将此代码段添加到“目标”的值?
if (buffer.empty())
break;
buffer.erase(buffer.size() - 1);
async_query("insert into " + db_name("files") + " ("
+ db_name("player") + ", "
+ db_name("goals") + ", "
+ db_name("completed") + ", "
+ db_name("fid") + ") values " + buffer
+ " on duplicate key update" + " "
+ db_name("player") + " = values("
+ db_name("player") + ")," + " "
+ db_name("goals") + " = values("
+ db_name("goals") + ")," + " "
+ db_name("completed") + " = values("
+ db_name("completed") + "),"
+ " mtime = unix_timestamp()");
buffer.clear();
答案 0 :(得分:1)
首先,这是纯粹的 MySQL 。它不会在其他SQL引擎上工作。
此外,我们的问题很模糊:
如果插入点击现有goals
,或者保留旧,您希望fid
的新值增加10吗?价值并将其增加10?
或者你想在两种情况下都使用goal
+ 10的新值吗?
删除C ++模糊处理后,您的查询将归结为:
insert into $db_name (player, goals, completed, fid) values $buffer
on duplicate key update
player = values(player),
goals = values(goals),
completed = values(completed),
mtime = unix_timestamp()
(变量由$xxx
表示)
我认为fid
是触发on duplicate key
的唯一索引或主键。
我希望您没有多个唯一索引,否则请求可能只会修改与输入值匹配的第一条记录。
假设fid
是关键,如果重复{{1},您的请求会删除player
,goals
和completed
字段(并更新时间戳)传递。
这对我来说似乎是一件不合时宜的事情,但你肯定有自己的理由。
我也想知道为什么在创建新记录时不更新时间戳,但这不是你问题的对象......
所以基本上你有三种可能性:
fid
设置为新目标+ 10 这需要调整神秘缓冲区的内容,将新目标值加10。
您的代码无需其他修改即可使用。
goals
设置为新记录的新值,并将旧记录设置为相同的新值+ 10 goals
insert into $db_name (player, goals, completed, fid) values $buffer
on duplicate key update
player = values(player),
goals = values(goals) + 10,
completed = values(completed),
mtime = unix_timestamp()
设置为新记录的新值,并将旧目标值增加10作为旧记录goals
由于我无法理解此查询的目的是什么,因此我将为您提供解决方案的选择。
答案 1 :(得分:0)
如果我理解这个问题,那么这应该有用,我对问题中使用的代码并不完全熟悉,但我觉得我理解你要做的事情。
为什么不将其分解为两个不同的MySQL查询。第一个是在创建此记录时运行,第二个是在更新记录时运行。现在因为我不太了解你的代码,我只会编写逻辑:
If the record you are going to insert does not exist, then create it
else if it does exist, get the current value of goals, add 10, the store it in a variable, Next update the record with the variable holding the new value of goals.
我使用我的PHP知识回答了这个问题所以我有一种感觉我错过了一些东西,所以感谢至少尝试一下这个想法,请让我知道这是否真的没有回答这个问题。
答案 2 :(得分:0)
此:
async_query("insert into " + db_name("files") + " ("
+ db_name("player") + ", "
+ db_name("goals") + ", "
+ db_name("completed") + ", "
+ db_name("fid") + ") values " + buffer
+ " on duplicate key update" + " "
+ db_name("player") + " = values("
+ db_name("player") + ")," + " "
+ db_name("goals") + " = values("
+ db_name("goals") + " + 10)," + " "
+ db_name("completed") + " = values("
+ db_name("completed") + "),"
+ " mtime = unix_timestamp()");
请注意,+10
位在sql查询中发生,实际上位于右侧表达式values()
内。在PHP脚本中,它在引号内。