MySQL插入/选择子查询语法
只是我不知道这个的正确语法。下面是我的查询,用简单的英语解释了我的子查询,就在我想执行它的地方MySQL插入/选择子查询语法,mysql,select,insert,subquery,Mysql,Select,Insert,Subquery,只是我不知道这个的正确语法。下面是我的查询,用简单的英语解释了我的子查询,就在我想执行它的地方 mysql_query("INSERT INTO donations( tid, email, amount, ogrequest, total ) VALUES ( '".esc($p->ipn_
mysql_query("INSERT INTO donations(
tid,
email,
amount,
ogrequest,
total
)
VALUES (
'".esc($p->ipn_data['txn_id'])."',
'".esc($p->ipn_data['pay_email'])."',
".(float)$amount.",
'".esc(http_build_query($_POST))."',
Here I want to select the row with the max date, get the value of the "total" column in that row, and add $amount to that value to form the new "total" for my newly inserted row.
)");
有人可以帮助兄弟吗?我无法访问MySQL服务器来验证我创建的内容,但请尝试以下方法:
INSERT INTO donations
(
tid,
email,
amount,
ogrequest,
total
)
SELECT
'".esc($p->ipn_data['txn_id'])."',
'".esc($p->ipn_data['pay_email'])."',
".(float)$amount.",
'".esc(http_build_query($_POST))."',
total + '".esc($amount)."'
FROM
ORDER BY date DESC
LIMIT 1
我没有直接使用“插入到(…)值(…)”,而是使用了“插入到(…)选择…”。SELECT语句检索日期最高的行(ORDER BY date DESC LIMIT 1),然后访问total字段并添加$amount值。您的子查询可能如下所示:
mysql_query("INSERT INTO donations(
tid,
email,
amount,
ogrequest,
total
)
VALUES (
'".esc($p->ipn_data['txn_id'])."',
'".esc($p->ipn_data['pay_email'])."',
".(float)$amount.",
'".esc(http_build_query($_POST))."',
(select max(total) from donations) + ".(float)$amount."
)");
SELECT total
FROM donations
WHERE tid = <x>
ORDER BY date DESC
LIMIT 1
真正的答案是您不应该将总数存储在此表中的列中。这真的不是什么有用的信息。您应该存储的是当前日期,然后通过SUM和GROUP BY计算总数。如果您需要经常访问它,则将该值缓存到其他位置 为什么在最后一行之前需要任何一行的总计?这只是浪费的数据,可以很容易地从表中重新生成 为什么要将总数存储在此列中。此数据为您的架构添加了什么值?这里需要注意的重要一点是,总额不是单个交易的财产。合计是单个交易的聚合子集的属性
另外,如果您没有在MySQL中使用货币列类型,请确保您使用的是DECIMAL而不是FLOAT。浮动值可能会导致舍入误差,具体取决于您所做的工作,这在涉及资金时是没有理由冒险的。您说得对。我这样做的唯一原因是因为我需要经常访问它,并且想知道在数百行中不断计算求和的开销。我想,不必遍历所有这些行,我只需要从最后一行中获取一个值,这样对DB的压力就会更小。您建议使用什么技术来缓存它?实际上,您根本不需要缓存它,因为MySQL可能会为您缓存它。在大型应用程序中,通常的做法是使用memcached()之类的东西,但如果您不想费心去了解这一点,您可以将值存储在另一个mysql表中,该表通过表上的触发器进行更新。谢谢你的建议和其他人的回答。。。他们非常感激。
mysql_query("INSERT INTO donations(
tid,
email,
amount,
ogrequest,
total
)
VALUES (
'".esc($p->ipn_data['txn_id'])."',
'".esc($p->ipn_data['pay_email'])."',
".(float)$amount.",
'".esc(http_build_query($_POST))."',
IFNULL(SELECT total
FROM donations
WHERE id = ".esc(p->ipn_data[txn_id']."
ORDER BY date DESC
LIMIT 1),0) + ".esc($p->ipn_data['value']
)");