MySql 查询或合并数组为 1

Posted

技术标签:

【中文标题】MySql 查询或合并数组为 1【英文标题】:MySql query or merge array into 1 【发布时间】:2016-11-10 18:45:00 【问题描述】:

我使用 ACF Pro,在数据库 wp_postmeta 中我有 2 个 meta_keydich_vu_%_name_servicedich_vu_%_price_service。两者都有 value ,所以我如何查询并将其返回为 (dich_vu_%_name_service,dich_vu_%_price_service)。或者,如果 mysql 无法处理它,那么我如何将这些查询的 2 个数组合并为一个这样的数组?

array(objects(['name_service'] => Test,['price_service'] => 9999))

这是我尝试过的代码

function getAllFaqs() 
global $wpdb;
    $results = $wpdb->get_results( $wpdb->prepare( 
    "SELECT DISTINCT meta_value FROM $wpdb->prefixposts,$wpdb->prefixpostmeta WHERE meta_key LIKE %s AND post_name = %s",
    'dich_vu_%_name_service',
    'bang-gia-dich-vu'
));
    $results2 = $wpdb->get_results( $wpdb->prepare( 
    "SELECT DISTINCT meta_value FROM $wpdb->prefixposts,$wpdb->prefixpostmeta WHERE meta_key LIKE %s AND post_name = %s",
    'dich_vu_%_price_service',
    'bang-gia-dich-vu'
));

    $array = array();
    foreach ($results as $result) 
        $array[]['name_service'] = $result->meta_value;
    
    $array = $array;
    $array2 = array();
    foreach ($results2 as $result2) 
        $array2[]['price_service'] = $result2->meta_value;
    
    $array2 = $array2;
    $array3 = array_combine($array,$array2);

感谢您的帮助!

【问题讨论】:

【参考方案1】:

联合是你的朋友,你可以将这两个查询结合起来(记住,两个结果集必须具有相同的列数和相同的类型并按顺序排列):

$query1 = $wpdb->prepare( 
    "SELECT DISTINCT meta_value FROM $wpdb->prefixposts,$wpdb->prefixpostmeta WHERE meta_key LIKE %s AND post_name = %s",
    'dich_vu_%_name_service',
    'bang-gia-dich-vu'
);
$query2 = $wpdb->prepare( 
    "SELECT DISTINCT meta_value FROM $wpdb->prefixposts,$wpdb->prefixpostmeta WHERE meta_key LIKE %s AND post_name = %s",
    'dich_vu_%_price_service',
    'bang-gia-dich-vu'
);

$results = $wpdb->get_results( $query1.' UNION '.$query2);

查看docs

P.S:我不知道 wordpress,但看到 prepare 返回经过清理的查询字符串,因此两者之间的 UNION 应该可以工作

【讨论】:

【参考方案2】:

为什么你让它变得如此复杂。只需像这样作为 WordPress 标准使用

global $wpdb;
// Instead of passing post slug, you need to use post id here
$myvals1 = get_post_meta($post->ID,"dich_vu_%_name_service", true);
$myvals2 = get_post_meta($post->ID,"dich_vu_%_price_service", true);

$obj = new StdClass();
$obj->name_service = $myvals1;  
$obj->price_service = $myvals2;  

$res = array($obj);

// result 
array(1) 
  [0]=>
  object(stdClass)#245 (2) 
    ["name_service"]=>
    string(4) "Test"
    ["price_service"]=>
    string(4) "9999"
  

【讨论】:

array(1) [0]=> object(stdClass)#2145 (2) ["name_service"]=> array(6) [0]=> object(stdClass)# 2157 (1) ["meta_value"]=> string(3) "ACF" [1]=> object(stdClass)#2156 (1) ["meta_value"]=> string(24) "三重测试" ["price_service"]=> array(6) [0]=> object(stdClass)#2151 (1) ["meta_value"]=> string(6) "15000" [1]=> object (stdClass)#2150 (1) ["meta_value"]=> string(7) "19000" 它向我展示了那样。但我想要这样:array(2) [0]=> object(stdClass)#2145 (2) ["name_service"]=>string(3 ) "ACF" ["price_service"]=>string(6) "150000" [1]=> object(stdClass)#2145 (2) ["name_service"]=>string(3) "三重测试" [ "price_service"]=>string(6) "150000" 你能告诉我'bang-gia-dich-vu'帖子有多少个像'dich_vu_%_name_service'这样的mata键吗?因为单个帖子的元键是唯一的。您想合并所有帖子中的所有两个键吗? 它可能有几百个或几千个 dich_vu_%_name_service 和 dich_vu_%_price_service,但 bang-gia-dich-vu 只是我使用 ACF 转发器字段的页面。它是商店名称服务和价格服务。我只想将 dich_vu_%_name_service 和 dich_vu_%_price_service 的所有值合并为一个类似于上面的格式,这样我就可以循环它并将数据获取到 html 表中。 我只想合并一篇文章/页面。

以上是关于MySql 查询或合并数组为 1的主要内容,如果未能解决你的问题,请参考以下文章

多表查询并将查询结果合并为一个多维数组

合并或合并索引不相等的两个或三个(多于三个)数组

合并排序数组

比这更简单的方法来展平或合并 php 数组?

合并mysql数组

将两个列数组合并为配置单元中的 1 个数组列