1

postmeta テーブルを使用して wordpress のカスタム コードを作成しています。アイテムはここに格納され、共通の pk1 は post_id です。

ただし、私がやっていることには、次のようなポストメタのクリック可能な部分がたくさんあります

  • source_site
  • source_author
  • source_rating

または似たようなもの。これで、同じ source_site または source_author を持つ異なる投稿の複数の投稿データがテーブルに保持されます。

次に、ユーザーが source_author をクリックすると、この source_author にリンクしているすべての投稿または記事を含む新しいテーブルに移動します。

問題は、投稿 ID の pk1 経由ではなく、postmeta 値にリンクしていることです。

これは、追加のクエリを実行するか、同じテーブルに結合する必要がある残りのデータを取得することを意味します。

これは私の質問につながります。結合またはサブクエリを実行する方が良いでしょうか。

さらなる問題は、postmeta テーブルにさまざまなデータとキーと値がすべて格納されるため、必要な他の部分を照会するのが難しくなることです。

テーブルは次のようになります

   |meta_id|post_id|meta_key|meta_value|
   |1      | 2     |source_author | Dan Holmes |
   |2      | 2     |source_site   |http://somesite.com|

このデータを取得する最もクリーンな方法を探しているだけですが、それ以外の場合は、作成者のために最初にデータを取得することしか考えられません。

$the_post_ids = select post_id from postmeta where meta_key='source_author' and meta_value='Dan Holmes'

foreach($the_post_ids as $post_id) {
   select * from postmeta where post_id=$post_id;
}

これはすべて非常に疑似コードであり、データがかなり大きくなり始めると、クリックできるセクションごとに多くのオーバーヘッドが発生するのではないかと心配しています。単一の配列に複数の選択を行う。

これを処理するより良い方法はありますか?

4

1 に答える 1

0

おっしゃるとおり、データベースが大きくなるにつれてパフォーマンスが問題になるため、データベースへのラウンドトリップをできるだけ少なくする必要があります。次のクエリのように、特定の作成者のすべてのメタテーブル行をプルバックします。

SELECT * FROM postmeta WHERE post_id IN
    (SELECT post_id FROM postmeta
        WHERE meta_key='source_author' AND meta_value='Dan Holmes'
    )

次に、結果を処理するために、PHPでforeachループを記述します。

編集

IN句を使用しない別のオプションを次に示します。

SELECT meta1.* FROM postmeta meta1
    INNER JOIN 
        (SELECT DISTINCT postid FROM postmeta
             WHERE postmeta.meta_key = 'source_author' AND postmeta.meta_value = 'Dan Holmes'
        ) meta2 
    ON meta1.post_id = meta2.post_id
于 2012-04-25T03:28:17.163 に答える