テーブルにスペースで区切られたコンテンツのタグ用のフィールドがあり、現在使用しています:
SELECT * FROM content WHERE tags LIKE '%$selectedtag%'"
しかし、選択されたタグがエレファントの場合、 bigelephantやエレファントブラーなどでタグ付けされたコンテンツが選択されます...
必要なものを正確に選択するにはどうすればよいですか?
SELECT * FROM content WHERE tags RLIKE '[[:<:]]elephant[[:>:]]'
テーブルがMyISAM
の場合、これを使用できます。
SELECT * FROM content WHERE MATCH(tags) AGAINST ('+elephant' IN BOOLEAN MODE)
FULLTEXT
これは、インデックスを作成することで大幅に改善できます。
CREATE FULLTEXT INDEX ix_content_tags ON content (tags)
、ただし、インデックスがなくても機能します。
@@ft_min_wold_len
これを機能させるには、4 文字未満の長さのインデックス タグがある場合は調整する必要があります。
MySQL の正規表現を使用できます。
SELECT * FROM content WHERE tags REGEXP '(^| )selectedtag($| )'
ただし、正規表現を使用するとオーバーヘッドが追加され、状況によってはパフォーマンスが低下する可能性があることに注意してください。
データベースのデータを変更できる場合のもう 1 つの簡単な方法は、最初のタグの前と最後のタグの後に空白スペースを確保することです。少し似ています:「象の動物」。そうすれば、ワイルドカードを使用できます。
SELECT * FROM content WHERE tags LIKE '% selectedtag %'
ここで別のデザインを検討します。tags
これは多対多の関係を構成するため、テーブルと結合テーブルを持つことができます。一般に、データの原子性により、多くの頭痛の種から解放されます。
このアプローチの追加の利点は、そのタグを含むすべてのエントリを編集しなくても、タグの名前を変更できることです。
A: contentid を持つコンテンツを指し、キーワードを含む別のタグ テーブルを作成する必要があります。
select a.*
from content a,tags b
where a.id=b.contentid
group by a.id;
B: のように、タグとその前後にコンマを入れてから",bigelephant,elephant,"
、like "%,elephant,%"
WHERE tags LIKE '% '{$selectedtag}' %'
OR tags LIKE ''{$selectedtag}' %'
OR tags LIKE '% '{$selectedtag}''
「%」は SQL のワイルドカードです。ワイルドカードを削除すれば、求めるものを正確に得ることができます。
テーブルのデザインをやり直しますが、今のところ、スペースを使用してタグ間を区切る場合は、次のようにすることができます。
SELECT * FROM content WHERE tags LIKE '% elephant %';
先頭と末尾にもスペースを入れてください (または、そのようにしている場合は、スペースをコンマに置き換えてください)。
繰り返しますが、最良のオプションは、データベースに多対多の関係を設定することですが、迅速で汚い 1 回限りの修正を探しているのではないかと思います。