1

私が解決しようとしていることを理解するのに役立つものがあるのだろうか。

私はワードプレスサイトで作業していますが、テンプレートファイル内でいくつかの結果を取得するためにクエリを実行しているだけなので、これはSQLの質問です。

広告ボックスである写真のギャラリーがあり、提供された映画名に関連してこれらをプルする必要があります。これを行うには、「adlink」(リンクオフ広告) と広告

私は nextgen ギャラリー プラグインを使用してこれらのテーブルをクエリしています。クエリする必要があるデータを含む合計 3 つのテーブルがあります。

ngg_pictures、nggcf_field_values & nggcf_fields。

nggcf テーブルはカスタム フィールド テーブルです。

これまでのところ、2 つの個別のクエリで必要なものを取得できますが、これらを 1 つのクエリに結合することはできません。これは、nggcf_field_values テーブルを 2 回クエリすることを意味し、並べ替えることができないようです。

mo の検索条件をハードコードしましたが、「close-encounters」ビットは渡された var になり、「156」は最初のクエリからの pid になります。

SELECT `eg_ngg_pictures`.`filename`, `eg_nggcf_field_values`.`fid`, `eg_nggcf_field_values`.`pid`
FROM eg_ngg_pictures, eg_nggcf_field_values
WHERE ((`eg_nggcf_field_values`.`field_value` LIKE 'close-encounters') AND (`eg_nggcf_field_values`.`pid` = eg_ngg_pictures.pid))



SELECT `eg_nggcf_field_values`.`field_value`
FROM eg_nggcf_field_values, eg_nggcf_fields
WHERE ((`eg_nggcf_fields`.`field_name` = 'adlink') AND (`eg_nggcf_fields`.`id` = eg_nggcf_field_values.fid) AND (`eg_nggcf_field_values`.`pid`  = '156'))

私が持っているもので結果を得ることができますが、これら2つを組み合わせてより良いSQlを書く方法を理解したいです。ありがとうございます

4

2 に答える 2

2

Wordpressの拡張機能を見た後eg_nggcf_fields、カスタムフィールドの名前を含むテーブルだと思います。このeg_nggcf_field_values表には、画像ごとのカスタムフィールドの値が含まれています。

movienameしたがって、 andという2つのフィールドを探している場合adlinkは、テーブルで2つの行を検索する必要がありfield_valuesます。別のエイリアスを指定すると、テーブルを2回結合できます。

select  pic.filename
,       pic.pid
,       fv1.field_value as MovieName
,       fv2.field_value as Adlink
from    eg_ngg_pictures pic
inner join -- Find ID for the field called 'moviename'
        eg_nggcf_fields f1
on      f1.field_name = 'moviename'
inner join -- Find value for field moviename for this picture
        eg_nggcf_field_values as fv1
on      fv1.pid = pic.pid
        and fv1.fid = f1.fid
inner join -- Find ID for the field called 'adlink'
        eg_nggcf_fields f2
on      f2.field_name = 'adlink'
inner join -- Find value for field adlink for this picture
        eg_nggcf_field_values as fv2
on      fv2.pid = pic.pid
        and fv2.fid = f2.fid
where   fv1.field_value like 'close-encounters'
于 2012-12-31T12:56:16.640 に答える
1

まず、JOINテーブルには最新のANSI構文を使用することをお勧めします。つまり、JOIN句を使用することをお勧めします。

使用する代わりに:

FROM table1, table2 WHERE table1.id = table2.pid

使用する:

FROM Table 1 JOIN table2 ON table1.id = table2.id

簡単にするために、コードを読みやすくする傾向があるため、テーブルのエイリアスを作成することもお勧めします。egg_ngg_pictures毎回書き出す代わりに、割り当てたエイリアスを参照するだけで済みます。

最後に、LIKE演算子を使用する場合、通常はワイルドカード文字(通常は%.ieLIKE '%123'またはLIKE '123%')を追加します。完全に一致するものだけを探しているようです。つまり、を使用し続けることができます。これ=により、パフォーマンスがわずかに向上するはずです。

クエリを書き直すために、次のようなものを使用します。

SELECT 
    pic.filename
    , fieldval.fid
    , fieldval.pid
    , fieldval.field_value
FROM 
    eg_ngg_pictures pic
        JOIN eg_nggcf_field_values fieldval ON fieldval.pid = pic.pid
        JOIN eg_nggcf_fields fields ON fields.id = fieldval.fid
WHERE 
    ((fieldval.field_value = 'close-encounters') 
    AND fields.field_name = 'ad_link'

スキーマがないため、クエリをテストできないことに注意してください。ただし、2つのクエリを1つのクエリに組み込むことにより、「close_encounters」値で取得されたfield_Values.PIDの結合がすでに存在しているはずです。

クエリが機能しない場合は、関連するテーブルといくつかのデータを使用してSQLフィドルを自由に作成してください。それを使用して、それを機能させるようにします。

于 2012-12-31T12:56:15.450 に答える