【问题标题】:Updating table A with information from table B (which contains duplicate information)使用表 B 中的信息更新表 A(包含重复信息)
【发布时间】:2014-06-27 15:49:33
【问题描述】:

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

这个数据库有两个表:表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 中的 -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 中完成,但我不确定运行需要多长时间。

【问题讨论】:

  • 我不确定这是否有效,因为我不知道在第二个选择中是否可以使用 order by 和 limt: update table a set a.dateofs = ( SELECT dofserv FROM orders WHERE customerid =" . $result['customerid'] . " ORDER BY dofserv DESC LIMIT 1).

标签: php mysql sql database


【解决方案1】:

一种方法是这样的:

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);

此查询将只更新clientsorders 中至少有一个匹配行的那些行。

【讨论】:

    【解决方案2】:

    您可以在聚合查询中 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
    

    【讨论】:

      【解决方案3】:

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

      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
                    )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-15
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多