2009-06-02 10 views
1

これは物事の仕組みです
私はWordpressのカテゴリテーブルを使用し、2つの主要なカテゴリがあります。最初のものは "location"で、もう1つは "subject"です。両方のカテゴリにはそれぞれ独自のサブカテゴリがあります。私の例ではWordpressの高度なSQL - 結合とカウント

我々はこれは私が私が私のカテゴリ17と3の両方のデータのみを選択したい
をやりたいです「location」カテゴリ17と「subject」カテゴリ3

を持っています提示されています。

このコードは、17と3は、同じ列内に存在するこれまで

SELECT term_id, post_title, post_name, ID, object_id, post_status 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 

問題
両方のカテゴリに働きます。上記のコードは、投稿が両方のカテゴリに現れた場合にIDを2回表示します。

結果に等しいIDを数える方法はありますか? IDが2回存在する場合は、そのIDから投稿を選択してください。

答えて

1

それは両方のカテゴリーに存在する場合、これは、一度だけ、各ポストを選択します:

SELECT post_title, post_name, post_status 
FROM wp_posts AS wpost 
WHERE post_status = 'publish' 
     AND EXISTS (
     SELECT 1 
     FROM  wp_term_relationships 
     INNER JOIN 
       wp_term_taxonomy 
     ON  wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
       AND wp_term_taxonomy.taxonomy = 'category' 
       AND wp_term_taxonomy.term_id IN (17, 3) 
     WHERE wp_term_relationships.object_id = wpost.ID 
     LIMIT 1, 1 
     ) 
+0

この例では、カウントの列を含む結果を表示します。 INNER JOINで行を削除すると少なくともエラーは出ませんが、17行または3行に行が表示されます。17行と3行の両方で行が表示されます。 –

+0

投稿を編集した後は魅力的です。ありがとう、私の日を救った! –

0

これはそれを行うだろうがなくても(カテゴリ3または17にあるエントリの重複行がありません)ネストされたクエリのために:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(*) as count 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 
    AND count = 2 

GROUP BY ID 

count variable and the GROUP BY clauseは重複を一緒に群生します追加。次に、countが2の行をフィルタリングして、両方のカテゴリのエントリを取得します。

+0

アイデアは素晴らしいですが、機能しません。それは私に空の結果を与えます。 –

+0

次の投稿に投稿したものと同じコメント:行が返されるまでカウントが存在しないため、「AND count = 2」は機能しません。予約語なので、countを ''に入れることをお勧めします。あなたが必要とするのは、 "count = 2"または "HAVING count(*)= 2"です。 –

0

ワンステップに近いですか?今私がする必要があるのは、 "count"列に "2"を含む行を表示する方法です。

"count count"が "loop"内で作成されているため、 "AND count = 2"と書くだけでは機能しませんでした。それは動作しません

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(ID) as count 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 

GROUP BY ID 
+0

行が返されるまでカウントが存在しないため、「AND count = 2」は機能しません。予約語なので、countを ''に入れることをお勧めします。あなたが必要とするのは、 "count = 2"または "HAVING count(*)= 2"です。 –

+0

@Jens:HAVING COUNT(*)= 2をクエリに追加することはできますが、LIMIT 1のEXISTSを使用する方が良いでしょう。GROUP BYはパフォーマンスが悪いです。 – Quassnoi

関連する問題