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

标签 php mysql woocommerce

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

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

有 56 个潜在的输入(并非全部是强制性的,因此一些可以保持 null)客户填写有关他们 child 的信息。我流程的这一部分工作正常。

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

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

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

第一个表叫做woocommerce_order_itemmeta,它的结构如下:

meta_id, 
order_item_id, 
meta_key, 
meta_value

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

下面两列的工作原理如下;当我创建一个输入字段作为产品附加组件并且客户完成订单时,meta_key 字段包含它是哪个inputmeta_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 ** meta_key** 是 *X* 并对每个条目执行此操作,然后将信息复制到更简单的表中。

我怀疑如果我有一个更清晰的结构并且可以只获取“Lastname,Firstname,Middlename,etc”的值而不必首先将其标识为 KEY,那么将它插入“lName、fName、mname 等”。

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

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

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

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

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

add_action( 'woocommerce_order_status_completed', 'register_player' );

唯一需要注意的是,我不能更改任何一个表的结构 - 它们就是它们的结构,因为许多其他不相关的功能都严重依赖它们。 (这实际上有点令人沮丧。)我很想只使用一张表而不是复制信息,但那样我就会重写别人的整个联赛管理应用程序,我既没有时间也没有时间这样做的专业知识。

任何解决方案将不胜感激。谢谢大家。

最佳答案

为了回答您问题的第一个分支,我在 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 没有任何经验。也许就这方面提出第二个更有针对性的问题可能会产生更好的结果!

祝你好运!

关于php - 如何从一个 SQL 表复制数据并在第二个不同的表中创建一个新条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20964735/

相关文章:

php - 为什么在 PHP 中执行 bool 测试后会发生变量赋值?

php - 如何设置 SQL 表以高效、轻松地存储单个事件的多个日期和时间?

php - 我正在尝试设置类,但在第 41 行不断收到错误 "num_rows line"错误是 "Trying to get property of non-object in line 41"

php - 如何将CSS应用于Wordpress/Woocommerce中除某些产品页面之外的所有页面?

php - 如何使用缩略图限制返回的产品类别(WooCommerce)

php - Eloquent 不会检索我作为 csv 导入的 mysql 表,但查询生成器会检索

php - 无需重新加载页面的聊天客户端/帖子

mysql - 错误代码 : 1054. 'sdate' 中的未知列 'where clause'

MySQL 慢查询 : How to optimize the following query?

php - 在 WooCommerce 3+ 中以编程方式创建多个优惠券