为多个变量 ID 插入多个静态值

Posted

技术标签:

【中文标题】为多个变量 ID 插入多个静态值【英文标题】:Insert multiple static values for multiple variable IDs 【发布时间】:2014-09-04 00:08:45 【问题描述】:

一些背景故事(与我的问题没有直接关系,但也许其他人可以使用我的方法)

我正在使用插件高级自定义字段在 WordPress v3.9.1 中工作。我已经从旧数据库中导入了一个自定义值的 CSV 文件(使用 WP Ultimate CSV Importer 插件,免费版本),该文件按照我在 WordPress 中的需要格式化,但有一个例外 - ACF 中继器字段。插件很棒,但还没有导入大量数据的好方法。

Repeater 字段在数据库中的存储方式如下:

meta_id  post_id meta_key           meta_value
3894       4697    beds               2
3895       4697    _beds              field_53bcfe244a98d
4051       4697    _beds_0_other      field_53c2273053218
4050       4697    beds_0_other       1
4051       4697    _beds_1_other      field_53c2273053218
4050       4697    beds_1_other       3

5894       4698    beds               2
5895       4698    _beds              field_53bcfe244a98d
5051       4698    _beds_0_other      field_53c2273053218
5050       4698    beds_0_other       1
5051       4698    _beds_1_other      field_53c2273053218
5050       4698    beds_1_other       3

也就是说;对于每个 post_id,都有一个名为“beds”的Repeater 字段。 “在”中继器字段是 1 个字段,重复两次。每个字段有 2 个数据库条目 - 一个字段引用(用于管理保存字段 - 每个字段始终相同)和一个值。设置不如想象的那么直观,但它是围绕 WordPress 的默认表格系统设计的。

实际问题

现在,我从旧数据库中导入了如下所示的字段:

meta_id  post_id meta_key           meta_value
####       4697    beds               2
####       4697    beds_0_other       1
####       4697    beds_1_other       3

####       4698    beds               2
####       4698    beds_0_other       1
####       4698    beds_1_other       3

我需要添加

meta_id  post_id meta_key           meta_value
####       4697    _beds              field_53bcfe244a98d
####       4697    _beds_1_other      field_53c2273053218
####       4697    _beds_0_other      field_53c2273053218

####       4698    _beds              field_53bcfe244a98d
####       4698    _beds_1_other      field_53c2273053218
####       4698    _beds_0_other      field_53c2273053218

meta_key 和 meta_value 是静态的 - 它们永远不会改变(在创建字段后,它会保留相同的字段_## 直到删除)。 meta_id 是自动递增的。

问题是我有 200 多个 post_id 值,每个都需要 50 个静态条目 - 不想硬编码。我可以使用以下方法选择所需的 ID:

SELECT DISTINCT ID
FROM  `wp_posts`
WHERE post_type =  "community"

// Returns:
post_id
4697
4698

简而言之

我怎样才能做到以下几点:

INSERT INTO `table` (`meta_id`, `post_id`, `meta_key`, `meta_value`)
VALUES
// foreach related distinct ID in wp_posts
 (NULL, 'ID', "_beds", "field_53bcfe244a98d"),
 (NULL, 'ID', "_beds_0_other", "field_53c2273053218"),
 (NULL, 'ID', "_beds_1_other", "field_53c2273053218")
// end foreach

**临时解决方案**

目前,我只是使用 php 转储所有数据并上传到 PHPMyAdmin。可以编写一个插入的 PHP 循环,但我正在寻找一个无需上传新的 php 文件(或 sql)即可使用的 mysql 解决方案。

$ids = array("4697", "4698" );

echo '
INSERT INTO `table` (`meta_id`, `post_id`, `meta_value`, `meta_key`)
VALUES<br />';
foreach ($ids as $id)
    echo '
(NULL, "'. $id .'", "1", "beds"),
(NULL, "'. $id .'", "field_53bcfe244a98d", "_beds"),
(NULL, "'. $id .'", "field_53c2273053218", "_beds_0_other"),
<br />';


【问题讨论】:

【参考方案1】:

最简单的方法是导入隐藏的自定义字段(前导下划线)以及元值。如果您只想清理数据,可以使用UNION SELECT 作为INSERT 的输入 - 您不需要meta_id,它将自动分配。请注意,此 SQL 不会在执行插入操作之前检查数据是否已存在,因此请确保您不会得到欺骗。

您可以通过在wp_postmeta 中查询所有带有meta_key 的“床”条目来获得所需的post_id。使用此post_id,您可以硬编码其他值并将它们作为SELECT 语句中的列的别名,然后用于INSERT 的值。

-- modify the wp_ prefix as needed
INSERT INTO `wp_postmeta` (`post_id`, `meta_key`, `meta_value`)
-- get "_beds" key/value for all entries with meta key of "beds"
SELECT post_id, '_beds' AS meta_key, 'field_53bcfe244a98d' AS meta_value
FROM wp_postmeta WHERE meta_key = 'beds'
UNION 
-- get "_beds_0_other" key/value for all entries with meta key of "beds"
SELECT post_id, '_beds_0_other' AS meta_key, 'field_53c2273053218' AS meta_value
FROM wp_postmeta WHERE meta_key = 'beds'
UNION 
-- get "_beds_1_other" key/value for all entries with meta key of "beds"
SELECT post_id, '_beds_1_other' AS meta_key, 'field_53c2273053218' AS meta_value
FROM wp_postmeta WHERE meta_key = 'beds'
-- order results (you can view what will be inserted if you run the SELECT without the INSERT)
ORDER BY post_id

您也可以将其作为三个不同的 INSERT 语句运行,而无需 UNION

【讨论】:

以上是关于为多个变量 ID 插入多个静态值的主要内容,如果未能解决你的问题,请参考以下文章

多个静态变量实例

同一应用程序中的多个静态变量范围?

在静态类中返回多个值

BroadcastReceiver 生命周期——静态变量

使用全局变量,当多个线程同时修改静态属性第二季

使用全局变量,当多个线程同时修改静态属性第三季