这有点棘手。我有一个非常具体的要求。
这个数据库有两个表:表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中最近的DOFSERV更新表A中的DATEOFS。
根据我的理解,如果只有一个匹配行,下面的查询将工作:
UPDATE clients a, orders b SET a.DATEOFS = b.DOFSERV WHERE a.customerid = b.customerid
但是,由于订单表有多个与customerid匹配的行,我不确定如何更新客户端。只包含最近订单的DATEOFS . dofserv .
有什么建议吗?想这样做在纯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);
这个查询将限制更新到clients
中至少有一个orders
中匹配的行。
您可以在聚合查询中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
这是一种只更新最小行数的方法:
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
)