如何从一个SQL表复制数据并在另一个不同的表中创建新条目?

时间:2014-01-07 05:42:58

标签: php mysql woocommerce

我对现有WooCommerce插件(Product Add-Ons扩展程序)的自定义应用程序存在双管齐下的问题。

我的WooCommerce / WordPress运行得非常好,我正在使用Product Add-Ons扩展来捕获客户孩子的注册信息,作为订单流程的一部分。

有56个潜在输入(并非所有必需的输入,因此有些可以保留 null ),客户填写有关其子女的信息。我流程的这一部分工作正常。

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

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

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

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

meta_id, 
order_item_id, 
meta_key, 
meta_value

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

以下两栏的工作原理如下:当我将输入字段创建为产品附加组件并且客户完成订单时, meta_key 字段包含输入 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,那么将它插入“很容易” L-NAME,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' );

唯一需要注意的是,我不能改变任何一个表的结构 - 它们就是这样的,因为许多其他不相关的函数严重依赖于它们。 (这实际上有点令人沮丧。)我很乐意只使用一张桌子而不是复制信息,但后来我会重写其他人的整个联盟管理应用程序而且我缺乏时间和专业知识。

任何解决方案都将不胜感激。谢谢你们。

1 个答案:

答案 0 :(得分:0)

要回答问题的第一个问题,我在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的经验。也许关于这方面的第二个更具针对性的问题可能会产生更好的结果!

祝你好运!