2016-04-18 10 views
2

私の投稿テーブルにブログの投稿が集まっています。 、MySQLでwhere句のクエリをカンマ区切りのIDで書き込む

+----+----------------------+-------------------------+ 
| id | title    | categories    | 
+----+----------------------+-------------------------+ 
| 1 | title 1    | 234, 235, 243   | 
| 2 | title 2    | 237      | 
| 2 | title 3    | 234, 243    | 
+----+----------------------+-------------------------+ 

を仮定し、私は、カテゴリ243は、私はすでにidはカテゴリフィールドの最初の番号であれば記事を選択することができFIND_IN_SET機能を使用しようとした投稿のすべてを選択しようとしています。

私の現在のクエリは、事前にthis- SELECT * FROM posts WHERE FIND_IN_SET(235, Category) <> 0 ORDER BY PostId DESC

おかげのようなものです。

+0

WHERE FIND_IN_SET(243、カテゴリ)は動作するはずです。 – Mihai

+0

正しい列名を入力してもよろしいですか? 'FIND_IN_SET(235、categories)' – poostchi

答えて

3

カテゴリをこのようなリストに格納することはどれほど難しいか知っておく必要があります。いくつかの理由があります:

  • 数字を文字列として保存するのが悪いです。
  • SQLの文字列操作関数は比較的貧弱です。
  • 結果のクエリではインデックスを使用できません。
  • 外部キー制約は宣言できません。

したがって、接合テーブルを使用するようにデータを修正する必要があります。

時には、私たちは他の人々の設計に悪い判断を下すこともあります。

この場合、問題はリスト内のスペースであるとわかります。しかし、私は正しくリレーショナルデータ構造を使用することをお勧めして接合テーブルを実装し

WHERE CONCAT(', ', 235, ', ') LIKE CONCAT('%, ', Category, ', %') 

WHERE FIND_IN_SET(235, replace(Category, ' ', '') > 0 

または、代わりにこれを試してみてください。

+0

great.worksは大丈夫です。 :)私は努力していますが、あなたは私の前に答えを与えてくれました。 – RJParikh

+0

すばらしい解決策。感謝します。 –

関連する問題