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']
            )");