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

Php 使用表B中的信息(包含重复信息)更新表A,php,mysql,sql,database,Php,Mysql,Sql,Database,这有点棘手。我有人有一个非常明确的要求 该数据库有两个表:表A客户表和表B订单表 表A的每一行都有一个唯一的客户ID customerid。它还有一个Date of Service DATEOFS列,该列主要由以前数据库中的旧信息填充 表B为每个订单提供了唯一的订单号ordernum。每个订单还链接到客户customerid,并具有订单dofserv的日期 为了在实际的PHP脚本中显示服务日期,我使用以下查询: SELECT dofserv FROM orders WHERE customeri

这有点棘手。我有人有一个非常明确的要求

该数据库有两个表:表A客户表和表B订单表

表A的每一行都有一个唯一的客户ID customerid。它还有一个Date of Service DATEOFS列,该列主要由以前数据库中的旧信息填充

表B为每个订单提供了唯一的订单号ordernum。每个订单还链接到客户customerid,并具有订单dofserv的日期

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

SELECT dofserv FROM orders WHERE customerid=" . $result['customerid'] . " ORDER BY dofserv DESC LIMIT 1
这将返回单个客户最近的服务日期

我试图用表B中的-most-recent-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实现,但我不确定运行需要多长时间。

一种方法是:

UPDATE clients a
SET
    a.DATEOFS=(SELECT MAX(b.DATEOFS) FROM orders b WHERE a.customerid=b.customerid);
但如果没有匹配的顺序,此查询将在a.DATEOFS中插入NULL。如果这不是您想要的,您可以将其稍微修改为:

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);
此查询将仅将更新限制为客户机中订单中至少有一个匹配行的行。

您可以在聚合查询上加入客户机表:

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

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

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
              )

我不确定这是否有效,因为我不知道在第二个select中是否可以使用order by和limt:update table a set a.dateofs=select dofserv FROM orders,其中customerid=$结果['customerid']。按dofserv DESC LIMIT 1订购。