2009-08-15 8 views
0

PHPでPostgres databaseから質問のタグを効果的に取得するにはどうすればよいですか?PHPでPostgresから多くのタグを効果的に取得するには

は、私は、インスタンスの変数それぞれquestions_question_idquestion_idを、持っているテーブルタグ質問を持っています。

1つの質問に複数のタグが含まれていることがあります。 テーブルからquestion_idtitletagを選択できます。 しかし、私はデータベースから1つの質問の多くのタグを効果的に取得する方法を知りません。 PHPはデータを行列として操作することを制限します。

question_id、title、およびtagを変数$ resultに読み込むことができます。 データは、variale $結果の中の私のためのマトリックスです。 しかし、私はマトリックスのようなデータを参照することはできません。

PHPではpg_fetch_rowpg_fetch_all_columnsの機能しか見つかりませんでした。前者は行の配列としてデータを取得し、後者は列の配列としてデータを取得します。

LEFT JOINと私の問題は、このようなquestion_idによってとタグ

  • グループデータをquestion_id、

    1. タイトルの列を取得する次のようにデータを取得することは可能ではないかもしれないことを私に示唆私の質問にタグを付けることができます:私はPHPでデータを操作しようとしましたが、私はthis farしか得られません。
  • 答えて

    1

    あなたが望むのは、特定の質問のすべてのタグを取得する2番目のクエリだと思います。一緒に参加しようとするのは面倒です。これはできますが、同じ質問データでタグのデータが異なる複数の行が表示されます。

    だから、最初にこのような何かを(これは単なる一例ですので、私はあなたのデータベースの構造を知らない)の操作を行います。

    その後
    SELECT * FROM QUESTIONS WHERE ID = <id>; 
    

    あなたの行うすべてを尋ね右1つ後のクエリ、タグ:

    SELECT * FROM TAGS WHERE QUESTION_ID = <question_id>; 
    
    +0

    これは本当に役立つ答えです - ありがとうございます! –

    2

    あなたは大胆であれば、あなたはあなたのために一緒に関連するすべてのタグを連結PostgreSQLで集約関数を実装することができ、その後、単一のクエリがあなたは(TM)やりたいだろう。

    pg=> create aggregate ARRAY_ACCUM (
        sfunc = array_append, 
        basetype = anyelement, 
        stype = anyarray, 
        initcond = '{}' 
    ); 
    
    pg=> select QUESTIONS.ID as "QID", 
    pg-> array_to_string(array_accum(TAG), ',') as "TAGS" 
    pg-> from QUESTIONS 
    pg-> left join TAGS on QUESTIONS.ID = TAGS.QID; 
    QID |  TAGS  
    -----+--------------- 
        1 | foo, bar, baz 
        2 | foo, bar 
        3 | foo 
        4 | 
    
    -- Reference, for completeness -- 
    pg=> select * from QUESTIONS; 
    id 
    ---- 
        1 
        2 
        3 
        4 
    (4 rows) 
    
    pg=> select * from TAGS; 
    qid | tag 
    -----+----- 
        1 | foo 
        1 | bar 
        1 | baz 
        2 | foo 
        2 | bar 
        3 | foo 
    

    この機能は、GROUP_CONCATと呼ばれます。 pgの下では、それは "Do It Yourself"と呼ばれています。 :)さて、そこに行くには微妙な方法もあります。このclever blog postとそのコメントをチェックしてください。そこから私は上記のcreate aggregateソリューションを盗んでしまいました。 :)

    +0

    このソリューションには大きな欠点が1つあります。あなたがタグを処理する必要があるような検索をして、与えられたタグで質問を表示できるなら、このソリューションはたくさんのデータベースにヒットすることがわかります。 –

    +0

    @マッシー、擬似コードほどではなく、投機的なパフォーマンスの懸念を反論するのは難しいです。私はあなたに 'EXPLAIN'と提案されている解決策を*プロファイル*することをお勧めします。 :) – pilcrow

    +0

    +1:興味深い解決策。 – Skurmedel

    関連する問題