2012-04-25 6 views
1

私はpostmetaテーブルを使ってwordpress用のカスタムコードを書いています。アイテムはここに格納され、共通のpk1はpost_idです。これをmysqlとPHPでクエリするより良い方法はありますか

は、しかし、私がやっている何

または類似のものをsource_ratingな

  • source_site
  • source_author
  • としてpostmetaのクリック可能な部分の束を持っています。これで、同じsource_siteまたはsource_authorを持つ異なる投稿の複数の投稿データがテーブルに保持されます。

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

    問題はpost-idのpk1ではなく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; 
    } 
    

    これはすべて非常に擬似コードなので、データがかなり大きくなると、これがクリックされる各セクションのオーバーヘッドが多くなり事実私は単一の配列に複数の選択を行う必要があります。

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

+1

Aがお勧めの方法だろう参加、IN句を使用せずに、別のオプションです。 PHPでサブクエリを実行するとパフォーマンスが低下します。 –

答えて

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ループを書く:私はこのクエリのような特定の著者のすべてのメタテーブルの行を引き戻すと思います。ここでEDIT

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 
+0

私の唯一の懸念事項は、Oracleの場合INクエリが1000個のアイテムしかサポートしていないことですが、これはおそらくこの時点では問題にはなりませんが、mySQLに同じ制限があるのだろうかと思います。私は最初に数えてそれを打ち消すことができたと思うし、その後チャンクに分割する – Dannymh

+0

@ user1355139良い点、私はそれを考えなかった。私の更新を参照してください、あなたは自己結合を使用して同じクエリを行うことができます。 – McGarnagle

+0

ありがとうありがとうございます – Dannymh