MySQL INSERT/SELECT 子查询语法
我就是无法理解这个语法的正确语法。下面是我的查询,在我认为我希望它执行的地方有我的子查询的简单英语解释。
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.
)");
有谁能帮帮小弟吗?
Just can't wrap my head around the proper syntax for this one. Below is my query, with a plain english explanation of my subquery, in the spot where I think I'd want it to execute.
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.
)");
Can anyone help a bro out?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
真正的答案是您不应该将总计存储在此表的列中。这确实不是什么有用的信息。您应该存储的是当前日期,然后通过 SUM 和 GROUP BY 计算总计。如果您需要经常访问它,则将该值缓存到其他地方。
为什么需要最后一行之前的任意行中的总计?这只是浪费的数据,可以很容易地从表中重新生成。
为什么要将总计存储在此列中。该数据为您的架构添加了什么价值?这里需要注意的重要一点是,总数并不是单个交易的属性。总数是各个交易的聚合子集的属性。
另外 - 如果您没有使用 MySQL 中的货币列类型,请确保使用 DECIMAL 而不是 FLOAT。 FLOAT 值可能会导致舍入误差,具体取决于您正在执行的操作,当涉及金钱时,没有理由冒这种风险。
The real answer is you should not be storing the total in a column in this table. It isn't really any useful information. What you should be storing is the current date, and then calculating the total via SUM and GROUP BY. If it's something that you need to access often, then cache the value elsewhere.
Why do you need the total in any of the rows before the last one? It is just wasted data, and it can be easily regenerated from the table.
Why do you want to store the total in this column. What value does this data add to your schema? The important thing to note here is that the total is NOT a property of the individual transaction. The total is a property of an aggregated subset of individual transactions.
Also - make sure you are using DECIMAL and not FLOAT for your monetary column types in MySQL if you aren't. FLOAT values could result in rounding errors depending on what you are doing, which is something there is no reason to risk when money is involved.
我无法访问 MySQL 服务器来验证我创建的内容,但请尝试以下操作:
我没有使用直接的“INSERT INTO (...) VALUES (...)”,而是使用了“INSERT INTO (...)” ) 选择 ...”。 SELECT 语句检索日期最高的行(ORDER BY date DESC LIMIT 1),然后访问总计字段并添加 $amount 的值。
I don't have access to a MySQL server to verify what I created, but try this:
Instead of using a direct "INSERT INTO (...) VALUES (...)" I used a "INSERT INTO (...) SELECT ...". The SELECT statement retrieves the row with the highest date (ORDER BY date DESC LIMIT 1), then the total field is accessed and added with the value of $amount.
您的子查询可能如下所示:
这当然要求您的表中有一个的最新总计值。
date
列。如果您运行这个(没有已有的外部查询),它应该返回单行单列结果,其中包含 tid =如果还没有 txn =行;在表中,那么它显然不会返回任何行。当用作 INSERT 语句的子查询时,您可能应该检查 NULL 并将其替换为数字 0(零)。这就是 IFNULL() 可以为您做的事情。
结合这个和你已经拥有的:
Your subquery could look like this:
This of course requires that you have a
date
column in your table. If you run this one (without the outer query you already have), it should come back with a single row, single column result containing the value of latest total for tid = <x>.If there's not already a row for txn = <x> in the table, then it will obviously return no row at all. When used as a subquery for your INSERT statement, you should probably check for NULL and replace it with a numeric 0 (zero). This is what IFNULL() can do for you.
Combining this and what you already have: