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