1

wp_postsとwp_postmetaの両方のテーブルを左に結合するのが好きです。私の投稿では、いくつかのメタボックスオプションを作成しました。

「ads」というカスタム投稿タイプを作成し、広告ごとに、公開日と有効期限をメタオプションとして設定したとします。

問題は、現在の日付が投稿メタテーブルの開始日よりも高く、投稿の有効期限よりも低いwp_postsテーブルから投稿のIDを取得するために、2つのテーブルをどのように結合できるかです。メタテーブル。

WP以外のユーザーの場合、wp_postsテーブルは従来のテーブルであり、各行は投稿を表し、wp_postmetaはキー値のペアテーブルであり、投稿IDに基づいて、投稿のメタオプションを説明する複数の行が含まれます。

単一のMySQLクエリでそのクエリを作成する方法はありますか?

敬具。

4

1 に答える 1

2

「開始日」は「publication_date」という意味です。

スキーマ定義がない場合は、列名とデータ型を推測します

これを取得する1つの方法は、EXISTS述部で相関サブクエリを使用することですが、これは最も効率的なアプローチではない場合があります。

SELECT p.id
  FROM wp_posts p
 WHERE EXISTS
       ( SELECT 1
           FROM wp_postmeta m1
          WHERE m1.wp_posts_id = p.id
            AND m1.meta_option_name = 'publication date'
            AND m1.meta_option_date_value <= NOW()
       )
   AND EXISTS
       ( SELECT 1
           FROM wp_postmeta m2
          WHERE m2.wp_posts_id = p.id
            AND m2.meta_option_name = 'expiration date'
            AND m2.meta_option_date_value > NOW()
       )

LEFTJOINの使用について具体的に質問されました

LEFT JOIN操作を使用して同等の結果を得ることができます(ただし、このクエリはINNER JOIN操作を実行するのと実際に同等です)。

SELECT p.id
  FROM wp_posts p
  LEFT
  JOIN wp_postmeta m1
    ON m1.wp_posts_id = p.id 
   AND m1.meta_option_name = 'publication date'
   AND m1.meta_option_date_value <= NOW()
  LEFT 
  JOIN wp_postmeta m2
    ON m2.wp_posts_id = p.id
   AND m2.meta_option_name = 'expiration date'
   AND m2.meta_option_date_value > NOW()
 WHERE m1.id IS NOT NULL
   AND m2.id IS NOT NULL
 GROUP 
    BY p.id 
于 2013-02-07T23:06:38.570 に答える