这有点棘手。我找到了一个非常具体要求的人。
此数据库有两个表:表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中完成它,但我不确定它需要多长时间才能运行。
答案 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);
此查询会将更新仅限制在clients
中orders
中至少有一个匹配行的那些行。
答案 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
)