Mysql WordPress数据库查询中的联接/求和自定义字段

Mysql WordPress数据库查询中的联接/求和自定义字段,mysql,wordpress,advanced-custom-fields,Mysql,Wordpress,Advanced Custom Fields,尽管在谷歌上搜索了2个小时,尝试了各种连接、联合、别名等等,但我仍然无法在一个表中从WordPress数据库检索wp_Posteta表中两个子查询的结果(我甚至不关心这里的wp_帖子,我感兴趣的所有数据都是Posteta) 我在数据库中有如下自定义字段(使用ACF插件管理),一个键表示区域,另一个键表示数值 | ID | meta_key | meta_value | | 1 | group_name | Japan

尽管在谷歌上搜索了2个小时,尝试了各种连接、联合、别名等等,但我仍然无法在一个表中从WordPress数据库检索wp_Posteta表中两个子查询的结果(我甚至不关心这里的wp_帖子,我感兴趣的所有数据都是Posteta)

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

|   ID   |   meta_key           |   meta_value   |
|   1    |   group_name         |   Japan        |
|   1    |   facility_index     |   0.83         |
|   2    |   group_name         |   USA          |
|   2    |   facility_index     |   4.51         |
我需要一个返回以下内容的查询,这样我就可以按地区计算总量(例如,按国家/地区,即按集团名称,所有贷款的贷款索引总和):

此查询两次列出组名称,而不是在第3列中列出设备索引:

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

据我所知,您正在寻找一个自定义SQL查询,即您不想使用
WP\u查询
对象

为此,我将使用一些联接而不是子查询。 另外,我鼓励您查询
post\u类型
,否则您可能会从自动保存/修订或类似错误结果中获取数据。
/*
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_类型条件以匹配所需的post类型

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

/* 
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'
";

我的猜测是,任何关于MySQL和Wordpress的问题,或者关于EAV模型的问题,都会很好地涵盖这一点exhaustively@Strawberry我更新了答案以处理元值丢失的情况。然而,从描述/示例来看,结果中似乎只需要包含所有属性的帖子
/* 
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'
";