3

私は、ワードプレスの分類システムを悪用している可能性があるサイトの分類法を開発しました。投稿は、参照するトピック (猫、犬、猿など) と、投稿は(たとえば、専門家、組織、記事)です。ですから、猫や犬に関するもので、組織に関するすべての投稿を見つけたいと思います。IN (猫、犬) と IN (組織) の線に沿った何か... 少なくとも私には理にかなっていますが、タスクの正しい SQL 構文を理解できません。

wordpress.comのこの記事で見つけたものに基づいて、以下のクエリから構築しています...しかし、「カテゴリ 1 または2) および (カテゴリ 3 に属します) (たとえば、猫 1=猫、2=犬、3=組織)。

これはおそらく非常に単純で、応答を受け取ったら自分自身を蹴ります。

SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id = 1,2,3
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->posts.post_status = 'publish'
ORDER BY $wpdb->postmeta.meta_value ASC

ありがとう!

4

1 に答える 1

1

2 つの条件がテーブルの異なる行に存在するterm_taxonomyため、結果セットの 1 つの行でそれらを比較するには、そのテーブルに 2 回結合する必要があります。

また、WHERE句で条件を使用しているため、LEFT JOINを使用する必要はないと思います。通常、外部結合は内部結合よりも低速です。

テーブル エイリアスを使用できるため、変数テーブル名を繰り返し続ける必要はありません。

したがって、これをテストしていませんが、次のものが必要なものに近いはずです。

SELECT * FROM $wpdb->posts p
 INNER JOIN $wpdb->postmeta m ON (p.ID = m.post_id)
 INNER JOIN $wpdb->term_relationships r1 ON (p.ID = r1.object_id)
 INNER JOIN $wpdb->term_taxonomy x1
  ON (r1.term_taxonomy_id = x1.term_taxonomy_id)
 INNER JOIN $wpdb->term_relationships r2 ON (p.ID = r2.object_id)
 INNER JOIN $wpdb->term_taxonomy x2
  ON (r2.term_taxonomy_id = x2.term_taxonomy_id)
WHERE x1.term_id IN (1, 2) AND x1.taxonomy = 'category'
 AND x2.term_id = 3 AND x2.taxonomy = 'category'
 AND p.post_status = 'publish'
ORDER BY m.meta_value ASC
于 2009-02-16T20:58:38.720 に答える