【问题标题】:How to copy data from one SQL table and create a new entry in a second, different table?如何从一个 SQL 表中复制数据并在第二个不同的表中创建一个新条目?
【发布时间】:2014-01-07 05:42:58
【问题描述】:

现有 WooCommerce 插件(产品附加组件扩展)的自定义应用程序存在两个方面的问题。

我的 WooCommerce/WordPress 运行良好,并且正在使用产品附加组件扩展来捕获客户孩子的注册信息,作为订单流程的一部分。

客户填写关于其孩子的 56 个潜在输入(并非全部是强制性的,因此有些可以保持 null)。我的这部分流程运行良好。

我还有一个(青年球员的)注册数据库,它是定制的联赛管理系统的一部分。该数据库表每行有 57 列。

我遇到的第一个问题是将第一个表中的所有数据复制到第二个表中,我想我明白为什么,只是不知道如何解决。

两个表都存在于同一个数据库中。

第一个表名为woocommerce_order_itemmeta,其结构如下:

meta_id, 
order_item_id, 
meta_key, 
meta_value

前两列不需要复制,因为它们包含的信息仅与 WooCommerce 本身有关。

以下两列的工作方式如下;当我创建一个输入字段作为产品附加组件并且客户完成订单时,meta_key 字段包含它是哪个 input 以及 meta_value包含客户输入的信息。

例如:

**meta_key** = Lastname, **meta_value** = Smith,
**meta_key** = Firstname, **meta_value** = John,

每个订单可能有 56 个与之关联。

现在,一旦在 WooCommerce 中将订单标记为已完成,我需要它执行将该特定订单的数据传输/复制到具有完全不同结构的第二个数据库中。

第二个表是signUps,它的结构更简单:

num, 
teamRole, 
lName, 
fName, 
mName, 
guardianMother, 
guardianMphone, 
guardianFather, 
guardianFphone

等...总共 57 行。 num 列是自增整数,可以跳过。

我遇到的问题是列不匹配 4 到 57,据我所知,这也有点困难,因为我必须选择 **meta_value** WHERE the **meta_key** is *X* 并为每个条目执行此操作,然后将信息复制到更简单的表格中。

我怀疑如果我有一个更清晰的结构并且可以获取“姓、名、中间名等”的值而无需首先将其标识为 KEY,那么只需将其插入“ lName、fName、mname 等"。

到目前为止,我可以在 phpMyAdmin 中得到以下查询:

INSERT INTO `signUps`(lName) SELECT `meta_value` FROM `woocommerce_order_itemmeta` WHERE `meta_key` = 'Lastname';

当我试图找到向查询添加第二个值的方法时,问题就出现了。

我基本上需要的是一种将收集到的所有数据复制到第二个表中相应列的方法。

我遇到的第二个问题是,当我按照文档所说的方式使用 woocommerce_order_status_completed 操作挂钩时,我们根本无法触发任何东西。

add_action( 'woocommerce_order_status_completed', 'register_player' );

唯一需要注意的是,我无法更改任何一个表的结构——它们就是这样,因为许多其他不相关的函数都严重依赖它们。 (这实际上有点令人沮丧。)我喜欢只使用一张表而不是复制信息,但是我会重新编写别人的整个联盟管理应用程序,我既缺乏时间又缺乏这样做的专业知识。

任何解决方案将不胜感激。谢谢各位。

【问题讨论】:

    标签: php mysql woocommerce


    【解决方案1】:

    要回答您的问题的第一个方面,我在 MS SQL Server 中有两种方法,这可能与 MySql 中的概念相同:一种称为“子选择方法”,另一种称为“多重自​​连接法”。

    其中第一个较慢,但适用于可能存在的“软字段”(您的情况下的元键和值)类型的任何不一致,而另一个更快但需要这种一致性,否则会完全失败。

    子选择方法:

    INSERT INTO signUps (lName, fName, mName)
    SELECT
        (meta_value FROM woocommerce_order_itemmeta WHERE meta_key = 'Lastname' AND order_item_id = 1234) as v1,
        (meta_value FROM woocommerce_order_itemmeta WHERE meta_key = 'Firstname' AND order_item_id = 1234) as v2,
        (meta_value FROM woocommerce_order_itemmeta WHERE meta_key = 'Middlename' AND order_item_id = 1234) as v3
    

    多种自连接方式:

    INSERT INTO signUps (lName, fName, mName)
    SELECT 
        t0.meta_value as 'Lastname',
        t1.meta_value as 'Firstname',
        t2.meta_value as 'Middlename'
    FROM woocommerce_order_itemmeta t0
    INNER JOIN woocommerce_order_itemmeta t1 ON t0.order_item_id = t1.order_item_id
    INNER JOIN woocommerce_order_itemmeta t2 ON t0.order_item_id = t2.order_item_id
    WHERE t0.order_item_id = 1234
    AND t0.meta_key = 'Lastname'
    AND t1.meta_key = 'Firstname'
    AND t2.meta_key = 'Middlename'
    

    您会看到,我还需要确保传递 order_item_id,否则我们会从您系统中的所有订单中找到名字、中间名和姓氏,每次都被复制(可能不是您想要的)。以上也是 MS 语法,所以你可能需要针对 MySql 进行调整。

    至于您问题的第二部分,.. 恐怕我对 WooCommerce 没有任何经验。也许就这方面提出第二个更有针对性的问题可能会产生更好的结果!

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多