2017-06-18 4 views
2

関連するすべてのメタを含む投稿の配列を取得する必要があります。 だから、そのように見えるようになります。Wordpress:Sqlは関連するすべてのメタで投稿を選択します

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 

しかし、それは失敗します。私がやろうとしている

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 : [ 
           [], 
           [] 
           ] 

何。

#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 

すべての関連メタを含むすべての投稿を1つのクエリで取得するにはどうすればよいですか?

+0

「失敗する」ということを明確にすることはできますか? SQLエラーが発生していますか、または期待どおりの結果が得られませんか? –

+0

内部結合の代わりに左結合はどうですか? – fortune

+0

これを行うプラグインが既に存在する可能性があります –

答えて

1

これらの2つの表には注意すべき点がいくつかあります。

  1. 投稿とポストメタには1対多の関係があります。したがってGROUP BY wp_posts.IDを使用すると、最初の関連するポストメタレコード(および他の関連するポストメタは表示されません)を使用して結果を1つのポストに限定します。
  2. INNER JOIN wp_postmetaを使用すると、がない投稿は返されません投稿メタがあります。あなたが使用することができます

一つのデザインパターンはGROUP BY wp_posts.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という名前のキーを持ち、すべてメタレコードの配列です。

ノートのカップル:

  • これにはポストメタを(あなただけのメタとの投稿をしたい場合はINNER JOINを使用)がない記事が含まれるようになるだろうLEFT JOINです。
  • 上記のコードのすべての列にwp_postsを記入していないため、列を追加することができます(post_contentなど)。
+0

はい、私はそれを手に入れます。だから、どのような解決策は限界を避けるために? 私はちょうどデータとすべての関連メタを投稿する必要があります – WebArtisan

+0

@Alicelf –

+0

ありがとうございますが、これは私が尋ねたものではありません。 はい、これをPHPで再構成することはできますが、1つのクエリで取得する必要があります。 クエリは投稿の配列を返す必要があり、各配列elemには投稿データとこの投稿メタに関するすべてのデータが含まれている必要があります。それはすべてです – WebArtisan

関連する問題