使用表B中的信息更新表A(包含重复信息)

时间:2014-05-09 19:29:14

标签: php mysql sql database

这有点棘手。我找到了一个非常具体要求的人。

此数据库有两个表:表A(客户表)和表B(订单表)。

表A的每一行都有唯一的客户ID(customerid)。它还有一个服务日期(DATEOFS)列,主要使用以前数据库中的旧信息填充。

表B对每个订单都有唯一的订单号(ordernum)。每个订单也链接到客户(customerid)并具有订单日期(dofserv)。

要在实际的PHP脚本中显示服务日期,我使用以下查询:

SELECT dofserv FROM orders WHERE customerid=" . $result['customerid'] . " ORDER BY dofserv DESC LIMIT 1

这将返回单个客户的最新服务日期。

我尝试做的是使用表B中最近的-DOFSERV更新表A中的DATEOFS。

据我了解,如果只有一个匹配的行,则以下查询将起作用:

UPDATE clients a, orders b SET a.DATEOFS = b.DOFSERV WHERE a.customerid = b.customerid

但是,由于orders表有多行与customerid匹配,因此我不知道如何使用最新的orders.DOFSERV更新clients.DATEOFS。

有什么建议吗?想在纯MySQL中执行此操作从命令行运行;我可以在PHP中完成它,但我不确定它需要多长时间才能运行。

3 个答案:

答案 0 :(得分:0)

一种方法是这样的:

UPDATE clients a
SET
    a.DATEOFS=(SELECT MAX(b.DATEOFS) FROM orders b WHERE a.customerid=b.customerid);

但如果没有匹配的订单,此查询会在NULL中插入a.DATEOFS。如果那不是你想要的,你可以稍微修改一下:

UPDATE clients a
    JOIN orders o ON a.customer_id=o.customer_id
SET
    a.DATEOFS=(SELECT MAX(b.DATEOFS) FROM orders b WHERE a.customerid=b.customerid);

此查询会将更新仅限制在clientsorders中至少有一个匹配行的那些行。

答案 1 :(得分:0)

您可以在聚合查询上join clients表:

UPDATE clients a
JOIN   (SELECT   customer_id, MAX(dofserv) AS md
        FROM     orders
        GROUP BY customer_id) b ON a.customerid = b.customerid
SET    a.dateofs = b.md

答案 2 :(得分:0)

这是一种只更新最少行数的方法:

update clients a
set dofserv = ( select max(dofserv)
                from orders b
                where b.customerid = a.customerid
              )
where exists  ( select *
                from orders b
                where b.customerid = a.customerid
                  and  b.dofserv   > a.dofserve
              )