0

コンテンツのギャラリーを並べ替える複雑なナビゲーションがあります。ナビゲーションはカテゴリに対応しており、ギャラリーは、ナビゲーションで選択されているカテゴリに基づいて、コンテンツのさまざまな組み合わせを表示する必要があります。ナビゲーションは次のように構成されています。

GROUP 1
category 1
category 2
category 3

GROUP 2
category 4
category 5
category 6

GROUP 3
category 7
category 8
category 9

各グループ内のすべてのアイテムをORステートメントとして扱うMySQLクエリを作成する必要があります。したがって、カテゴリ1とカテゴリ2を選択すると、カテゴリ1とカテゴリ2の両方でタグ付けされたすべてのアイテムが返されます。

また、各グループ間の項目はANDステートメントとして扱う必要があります。したがって、カテゴリ1とカテゴリ4を選択すると、カテゴリ1とカテゴリ4の両方に含まれるアイテムのみが返されます。

これらのクエリは両方とも単純な形式で実行できますが、各グループ内に複数のカテゴリを持つ複数のグループを含める必要がある場合は、うまくいかないようです。

英語では、最後のクエリは次のようなことができる必要があります。

"category 1" OR "category 2" OR "category 3" 
AND
"category 4" OR "category 5"
AND
"category 6" OR "category 7"

私はこれについて多くのクエリの多くのバージョンで苦労しました、そして私は現在実用的な答えを持っていません。参考までに、それだけの価値がある場合は、現在私が持っているものを次に示します。

SELECT ct.entry_id,
    ct.entry_date AS date,
    ct.title AS title,
    cp.cat_id AS category_id
FROM exp_channel_titles AS ct
LEFT JOIN exp_channel_data AS cd ON ct.entry_id = cd.entry_id
LEFT JOIN exp_category_posts AS cp ON ct.entry_id = cp.entry_id
WHERE ct.channel_id = '2'                        
AND ct.site_id = '1'

AND cp.cat_id IN (119)
AND cp.cat_id IN (121)

GROUP BY ct.entry_id 
ORDER BY ct.entry_date DESC

whereの原因のcat_id行は、整理する必要があるもののようです。広い意味で使ってみたHAVINGも使ってみましたが、もっと具体的な使い方(使うのが正しいのなら)に変更しようとしているのでよくわかりません。 m有用な結果が得られない。以下のクエリの変数は、チェックされるカテゴリに基づいて動的に構築されています。

AND ct.entry_id IN (SELECT entry_id
                FROM exp_category_posts 
                WHERE cat_id IN (".$category_ids.") 
                GROUP BY entry_id
                HAVING COUNT(DISTINCT cat_id) = " . 
                count($category_array) . ")

任意のガイダンスをいただければ幸いです。

更新:ゴードンの答えのおかげで、私は今、機能するクエリを持っています。クエリの一部(どのカテゴリIDが選択されているかなど)は動的に構築されますが、参照用のクエリの静的バージョンは次のとおりです。

SELECT ct.entry_id,
   ct.entry_date AS date,
   ct.title AS title,
   cp.cat_id AS category_id
FROM exp_channel_titles AS ct
LEFT JOIN exp_channel_data AS cd ON ct.entry_id = cd.entry_id
LEFT JOIN exp_category_posts AS cp ON ct.entry_id = cp.entry_id
WHERE ct.channel_id = '2'                        
AND ct.site_id = '1'
GROUP BY ct.entry_id 
HAVING MAX(CASE WHEN cp.cat_id IN (119,122) THEN 1 ELSE 0 END) = 1 AND
       MAX(CASE WHEN cp.cat_id IN (129,127) THEN 1 ELSE 0 END) = 1 AND
       MAX(CASE WHEN cp.cat_id IN (140) THEN 1 ELSE 0 END) = 1 
ORDER BY ct.entry_date DESC
4

1 に答える 1

1

したがって、entry_idごとに複数の行を持つテーブルcategory_postsがあるようです。entry_idのさまざまな行のカテゴリが条件を満たしている必要があります。

これには、having句が必要です。

select cp.entry_id
from category_posts cp left outer join
     group1 g1
     on cp.cat_id = g1.cat_id left outer join
     group2 g2
     on cp.cat_id = g2.cat_id left outer join
     group3 g3
     on cp.cat_id = g3.cat_id
group by cp.entry_id
having max(case when g1.cat_id is not null then 1 else 0 end) = 1 and
       max(case when g2.cat_id is not null then 1 else 0 end) = 1 and
       max(case when g3.cat_id is not null then 1 else 0 end)

つまり、各グループから少なくとも1つの代表的なカテゴリがあります。

于 2012-08-28T00:36:50.330 に答える