【问题标题】:MySQL query and array output from same database column来自同一数据库列的 MySQL 查询和数组输出
【发布时间】:2014-08-25 22:10:29
【问题描述】:

我对 PHP 和 MySql 还是很陌生,我不确定这是否会作为 SQL 或 PHP 来实现。

我有以下疑问:

SELECT wp_posts.ID,
    wp_postmeta.meta_value
FROM wp_posts 
    INNER JOIN wp_postmeta
       ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'cooney_properties'
AND wp_posts.post_status = 'publish'
AND (wp_postmeta.meta_key = 'longitude' OR wp_postmeta.meta_key = 'latitude')

这是来自我的 Wordpress 数据库,您可以看到经度和纬度值位于同一列“meta_key”下。

上述查询中的数组给了我与以下类似的结果(不完全是粗略的例子):

Array
    (
     [0] => stdClass Object
    (
        [ID] => 25016273
        [meta_value] => 51.01454
    )
     [1] => stdClass Object
    (
        [ID] => 24617570
        [meta_value] => 51.01447
    )
     [2] => stdClass Object
    (
        [ID] => 24780750
        [meta_value] => 51.01535
    )

     ------------------- (later on items with same ID) -------------

     [141] => stdClass Object
    (
        [ID] => 24617570
        [meta_value] => -3.107139
    )
     [142] => stdClass Object
    (
        [ID] => 24780750
        [meta_value] => -3.096807
    )
     [143] => stdClass Object
    (
        [ID] => 24764956
        [meta_value] => -3.104187
    )
    )

来自数据库的同一列我不知道它是否可以在我的查询中修复或者它是否是 PHP 修复,我需要具有相同 ID 的项目在同一个数组中,并且可能重命名键,如果可能,如下所示:

 Array
    (
     [0] => stdClass Object
    (
        [ID] => 25016273
        [longitude] => 51.01454
        [latitude] => -3.107139
    )
     [1] => stdClass Object
    (
        [ID] => 24617570
        [longitude] => 51.01447
        [latitude] => -3.096807
    )
     [2] => stdClass Object
    (
        [ID] => 24780750
        [longitude] => 51.01535
        [latitude] => -3.104187
    )
   )

【问题讨论】:

    标签: php mysql sql arrays wordpress


    【解决方案1】:

    您也可以更改 sql 以获取 meta_key 字段:

    SELECT wp_posts.ID,
        wp_postmeta.meta_value,
        wp_postmeta.meta_key
    FROM wp_posts
        INNER JOIN wp_postmeta
           ON wp_posts.ID = wp_postmeta.post_id
    WHERE wp_posts.post_type = 'cooney_properties'
    AND wp_posts.post_status = 'publish'
    AND (wp_postmeta.meta_key = 'longitude' OR wp_postmeta.meta_key = 'latitude')
    

    然后您可以迭代返回的数组,并使用 ID 值作为索引填充一个新数组。您可以使用isset() 检查新数组中是否存在具有当前 id 的项目。如果是这样,添加到它(例如添加纬度值)否则创建项目:

    $new=array();
    
    foreach($result as $item){
    
        if(isset($new[$item->ID])){
    
            $new[$item->ID][$item->meta_key] = $item->meta_value;
    
        }else{
    
            $new[$item->ID] = array('ID' => $item->ID, $item->meta_key => $item->meta_value);
        }
    }
    print_r($new);
    

    【讨论】:

      【解决方案2】:

      我认为首先您必须在查询中添加一个“类型”值,以指示元值是“经度”还是“纬度”:

      SELECT wp_posts.ID,
          wp_postmeta.meta_value,
          wp_postmeta.meta_key as type
      FROM wp_posts 
          INNER JOIN wp_postmeta
             ON wp_posts.ID = wp_postmeta.post_id
      WHERE wp_posts.post_type = 'cooney_properties'
      AND wp_posts.post_status = 'publish'
      AND (wp_postmeta.meta_key = 'longitude' OR wp_postmeta.meta_key = 'latitude')
      

      这样,你的自动输入数组会是这样的:

      Array
          (
           [0] => stdClass Object
          (
              [ID] => 25016273
              [meta_value] => 51.01454
              [type] => 'longitude'
      
          )
           [1] => stdClass Object
          (
              [ID] => 24617570
              [meta_value] => 51.01447
              [type] => 'longitude'
          )
           [2] => stdClass Object
          (
              [ID] => 24780750
              [meta_value] => 51.01535
              [type] => 'longitude'
          )
      
           ------------------- (later on items with same ID) -------------
      
           [141] => stdClass Object
          (
              [ID] => 24617570
              [meta_value] => -3.107139
              [type] => 'latitude'
          )
           [142] => stdClass Object
          (
              [ID] => 24780750
              [meta_value] => -3.096807
              [type] => 'latitude'
          )
           [143] => stdClass Object
          (
              [ID] => 24764956
              [meta_value] => -3.104187
              [type] => 'latitude'
          )
      

      然后您可以使用循环来填充数组,使用特殊条件:

      $result = array();
      foreach(your_array AS $k => $v) {
        $result[$v->id][$v->type] = $v->meta_value;
      }
      

      此时你有一个这样的数组:

      array(
        [25016273] = array(
          ['longitude'] => 51.01454,
          ['latitude'] => -3.104187
        ),
        [24617570] = array(
          ['longitude'] => 51.01454,
          ['latitude'] => -3.104187
        )
        ....
      )
      

      如果你想要你在问题中指出的输出结构,你可以迭代这个数组以获得你想要的:

      $result = array()
      $i = 0
      foreach ($new_array as $k => $v) {
        result[$i]->id = $k;
        if (isset($v['longitude']) result[$i]->longitude = $v['longitude'];
        if (isset($v['latitude'])result[$i]->latitude = $v['latitude'];
        $i++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        • 2017-07-15
        • 2017-09-30
        相关资源
        最近更新 更多