テーブルをposts
テーブル(カテゴリリストフィールドなし)とposts_categories
テーブル(post_idフィールドとcategory_idフィールド)にリファクタリングするのが最適です。
次に、このような単純なクエリを使用します。
SELECT DISTINCT p.*
FROM posts_categories AS pc
INNER JOIN posts AS p ON pc.post_id = p.post_id
WHERE pc.category_id IN ([your list of values])
;
残念ながら、ほとんどのデータベースライブラリは、パラメータの任意のリストをサポートしていないので、あなたは、コード内で?,?,?,...
の正確なシリーズを生成する必要があるかもしれませんが。私はpdoに慣れていないだけで、わずかにPHPに知り合いです。
編集:投稿からのデータのみを表示し、投稿ごとに1回のみ表示するように調整されたクエリ。
あなたにもカテゴリのリストが必要な場合....
SELECT DISTINCT p.*
, GROUP_CONCAT(assoc_pc.category_id SEPARATOR ';') AS catList
FROM posts_categories AS filtering_pc
INNER JOIN posts AS p ON filtering_pc.post_id = p.post_id
INNER JOIN posts_categories AS assoc_pc ON p.post_id = assoc_pc.post_id
WHERE filtering_pc.category_id IN ([your list of values])
GROUP BY p.post_id
;
GROUP_CONCAT
は、MySQL固有のものです。プラットフォームの独立性をさらに強化したい場合は、SELECT p.*, assoc_pc.caetgory_id
とし、ORDER BY p.post_id
とし、グループ化されていない結果を処理するときにcatListをコードで構築することができます。
編集:2番目のクエリの例では、誤植が正しくありません。
テーブル構造のリファクタリングはオプションですか?フィールドに区切られたリストを格納することは、(ほとんど)常に避けなければなりません。 – Uueerdo
これは可能ですが、通常は何が速いのですか? 2つの個別のクエリまたはREGEXPを使用する1つのクエリ?多くのテーブルでの使用を避けようとしています。 – PhyCoMath
REGEXPとLIKEは最も遅い演算子の1つで、1つのクエリで関連するテーブルを結合する方が適しています。 – Uueerdo