在 WordPress 数据库查询中加入/求和自定义字段

Posted

技术标签:

【中文标题】在 WordPress 数据库查询中加入/求和自定义字段【英文标题】:Joining/summing custom fields in WordPress database query 【发布时间】:2015-08-04 23:28:12 【问题描述】:

尽管谷歌搜索了 2 小时并尝试了各种 JOINS 和 UNIONS 和 ALIASES 等等,但我仍然无法在一个表中检索 WordPress 数据库中 wp_postmeta 表中两个子查询的结果(我什至没有这里关心wp_posts,我感兴趣的数据都在postmeta中)。

我在数据库中有如下所示的自定义字段(使用 ACF 插件管理),其中一个键用于区域,另一个键用于数值。

|   ID   |   meta_key           |   meta_value   |
|   1    |   group_name         |   Japan        |
|   1    |   facility_index     |   0.83         |
|   2    |   group_name         |   USA          |
|   2    |   facility_index     |   4.51         |

我需要一个返回以下内容的查询,以便我可以按地区计算聚合(例如,所有设施的设施索引总和,按国家/地区,即按组名):

|   ID   |   group_name  |   facility_index   |
|   1    |   Japan       |   0.83             |
|   2    |   USA         |   4.51             |

此查询列出了两次 group_name,而不是在第 3 列中列出了 facility_index:

SELECT post_id, meta_value, result2.meta_value FROM
(
(
SELECT post_id, meta_value
FROM wp_postmeta
WHERE meta_key = "group_name"
)
UNION
(
SELECT post_id, meta_value
FROM wp_postmeta
WHERE meta_key = "facility_index"
)
) AS result2
GROUP BY post_id

编辑以显示完全符合我要求的最终查询,这要感谢以下接受的答案:

SELECT
  meta1.meta_value AS group_name,
  meta2.meta_value AS facility_index,
  SUM(meta2.meta_value) AS 'fac_index_geo' 
FROM wp_posts post
  LEFT JOIN wp_postmeta meta1 ON meta1.post_id = post.ID AND meta1.meta_key = 'group_name'
  LEFT JOIN wp_postmeta meta2 ON meta2.post_id = post.ID AND meta2.meta_key = 'facility_index'
WHERE
  post.post_type = 'facility'
  GROUP BY group_name

【问题讨论】:

我的猜测是,任何关于 mysql 和 Wordpress 或一般 EAV 模型的问题都会相当详尽地涵盖这一点 【参考方案1】:

据我了解,您正在寻找自定义 SQL 查询 - 即您不想使用 WP_Query 对象。

为此,我会使用一些 JOINS 而不是子查询。 此外,我鼓励您查询post_type,否则您可能会从自动保存/修订或类似的错误结果中获取数据。

/*
INNER JOIN
This query will only return posts that contain all meta values
i.e. all 'post' items with group_name AND facility_index
*/
$sql = "
SELECT
  post.ID,
  meta1.meta_value AS group_name,
  meta2.meta_value AS facility_index
FROM $wpdb->posts post
  INNER JOIN $wpdb->postmeta meta1 ON meta1.post_id = post.ID AND meta1.meta_key = 'group_name'
  INNER JOIN $wpdb->postmeta meta2 ON meta2.post_id = post.ID AND meta2.meta_key = 'facility_index'
WHERE
  post.post_type = 'post'
";

$data = $wpdb->get_results( $sql );

只需确保更新 post_type 条件以匹配您所需的帖子类型。

如果您还想获取缺少元值的帖子,也可以使用此查询

/* 
LEFT JOIN
This query will return all posts even if they have missing meta values
i.e. if group_name or facility_index is empty, then NULL is returned in the column
*/
$sql = "
SELECT
  post.ID,
  meta1.meta_value AS group_name,
  meta2.meta_value AS facility_index
FROM $wpdb->posts post
  LEFT JOIN $wpdb->postmeta meta1 ON meta1.post_id = post.ID AND meta1.meta_key = 'group_name'
  LEFT JOIN $wpdb->postmeta meta2 ON meta2.post_id = post.ID AND meta2.meta_key = 'facility_index'
WHERE
  post.post_type = 'post'
";

【讨论】:

@Strawberry 我更新了答案以处理缺少元值的情况。但是,从描述/示例来看,结果中似乎只需要包含所有属性的帖子

以上是关于在 WordPress 数据库查询中加入/求和自定义字段的主要内容,如果未能解决你的问题,请参考以下文章

在 MySql 中加入和求和?

如何在需要按一个键列分组的 3 个表中加入和求和值

我想在我的 Wordpress 菜单中加入一个高级自定义字段

在 Spark 中加入倾斜的数据集?

在 jquery 数据表中加入查询问题

如何在 Cloud Firestore 查询中加入多个文档?