2017-06-18 66 views
2

我需要获得与所有相关元的职位数组。 所以应该看起来像这样:WordPress的:Sql选择与所有相关元的职位

post 
    postfields from post table : [ 
           'title' =>... 
           'content'=>... 
           etc.... 
           ] 
    array of values from meta : [ 
           [], 
           [] 
           ], 
post 
    postfields from post table : [ 
           'title' =>... 
           'content'=>... 
           etc.... 
           ] 
    array of values from meta : [ 
           [], 
           [] 
           ] 

我想要做的事:

SELECT 
    * 
FROM wp_posts 
    INNER JOIN wp_postmeta 
    ON wp_posts.ID = wp_postmeta.post_id 
    WHERE wp_posts.post_type = 'page' 
    GROUP BY wp_posts.ID 

但它失败。

#1055 - Expression #24 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'somedbname.wp_postmeta.meta_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

如何在一个查询中获得与所有相关元的所有帖子?

+0

你能澄清你的意思是“它失败”吗?您是否收到SQL错误,或者得到的结果与您期望的不同? –

+0

左连接而不是内连接怎么样? – fortune

+0

可能已经有插件那样做 –

回答

1

这两张表有几件事要注意。

  1. 帖子和帖子Meta有一对多的关系。因此,通过使用GROUP BY wp_posts.ID,您可以将您的结果限制为具有第一个可关联帖子元记录的单个帖子(并且不会显示任何其他相关帖子元)。
  2. 通过使用INNER JOIN wp_postmeta查询将不会返回任何有帖子元。您可以使用

一个设计模式是不GROUP BY wp_posts.ID执行查询(这将导致在单个职位多行,因为每一行都将包含相同的帖子ID,但不同岗位间位)和调整你的阵列在PHP中。与做多个查询相比,PHP中的这种循环相当高效。如果需要,还可以将结果缓存在transient中。

为了用一个例子阐明,你应该能够像这样进行查询:

global $wpdb; 
$results = $wpdb->get_results("SELECT * FROM wp_posts LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id WHERE wp_posts.post_type = 'page' ORDER BY wp_posts.ID"); 

if (! empty($results)) { 
    $previous_id = 0; 
    $structured_results = array(); 
    foreach ($results as $post) { 
     if ($previous_id !== $post->ID) { 
      $structured_results[ $post->ID ] = array(
       'ID' => $post->ID, 
       'post_author' => $post->post_author, 
       'post_date' => $post->post_date, 
       'post_title' => $post->post_title, 
       // etc for all other columns in wp_posts 
       'post_meta' => array(
        $post->meta_id => array(
         'meta_key' => $post->meta_key, 
         'meta_value' => $post->meta_value, 
        ), 
       ), 
      ); 
     } else { 
      $structured_results[ $post->ID ]['post_meta'][ $post->meta_id ] = array(
       'meta_key' => $post->meta_key, 
       'meta_value' => $post->meta_value, 
      ); 

     } 
     $previous_id = $post->ID; 
    } 
} 

这会给你一个名为structured_results结果的单一阵列。数组中的每个元素都是单个帖子(关键是帖子ID)。每个元素将包含wp_posts的所有列。另外,每个元素将有一个名为post_meta的密钥,这是一个所有后期元记录的数组。

有两点要注意:

  • 这是一个LEFT JOIN所以这将包括没有元后(使用INNER JOIN如果只想驿卒元)的职位。
  • 我没有填写wp_posts以上代码中的所有列,因此您可以添加其他列(如post_content等)。
+0

是的,我明白了。那么,什么解决方案可以避免限制? 我只需要发布数据和所有相关的meta – WebArtisan

+0

@Alicelf我更新了我的答案和一些适用于您的示例代码 –

+0

谢谢,但这并不完全是我问的。 是的,我可以重新组合在php中,但我需要得到它在一个单一的查询。 因此,查询应该返回帖子数组,每个数组elem应该包含发布数据和所有与这篇文章元相关。这就是全部 – WebArtisan

相关问题