2017-06-18 64 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

相關問題