2016-05-23 2 views
0

1;2;3;4;のような文字列category IDsがあります。REGEXPを使用してカテゴリが複数のカテゴリIDに似ている投稿を選択

今、postsテーブルのcategory列に、これらの変数を含むすべての投稿を取得したいとします。

category列には、投稿に添付されているカテゴリによっては1;2;3;のような内容もあります。

投稿テーブルのcategory列にプライマリ文字列の値が含まれているかどうかを確認するには、どうすればPDO queryを設定できますか?

私はcategory LIKE = IN (2;3;4;)のようなものを探していますが、これはダブル/トリプルのように... 2;44;23;の数字で動作する必要があります。

例:

  • 投稿1:1; 2。
  • 投稿2:3;
  • ポスト3:1;

私はポストテーブルからフェッチした文字列1;を使用して、彼らは両方の1;が含まれているので、私は戻って欲しい結果がPost 1Post 3です。

+0

テーブル構造のリファクタリングはオプションですか?フィールドに区切られたリストを格納することは、(ほとんど)常に避けなければなりません。 – Uueerdo

+0

これは可能ですが、通常は何が速いのですか? 2つの個別のクエリまたはREGEXPを使用する1つのクエリ?多くのテーブルでの使用を避けようとしています。 – PhyCoMath

+0

REGEXPとLIKEは最も遅い演算子の1つで、1つのクエリで関連するテーブルを結合する方が適しています。 – Uueerdo

答えて

1

テーブルを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番目のクエリの例では、誤植が正しくありません。

+0

このクエリに問題がありました。カテゴリ文字列が与えられていない場合、すべての投稿を取得する方法はありますか? – PhyCoMath

+0

同じクエリではありません。 'WHERE'を完全に取り出すことができます。 'post_categories AS filtering_pc INNER JOIN'とそれに対応する' ON filtering_oc.post_id = p.post_id'を使用して、元のテーブルのような結果を得ることができます。私が指摘した結合条件でタイプミスが発生したことに気付きました。 – Uueerdo

+0

私は奇妙な問題に遭遇しましたが、私はまだそれを検証することができませんでした...私のクエリでは結果が倍増しているようです。これは何とか間違っていますか? '$ sql =" SELECT DISTINCT COUNT(n.news_id)FROM news_attributes na INNER JOINニュースn ON na.attribute_news = n.news_id LEFT JOIN言語ON ON n.news_lang = l.language_id WHERE((l.language_val =:language) OR(n.news_lang_all IS NOT NULL))AND n.news_deleted IS NULLとn.news_published = 1 "; ' – PhyCoMath

関連する問題