문제
내 컨텐츠에 대한 태그에 대한 필드에 필드가 있으며 공간으로 분리되어 있으며 현재 사용하고 있습니다.
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)
, 이는 a를 만들어 크게 향상시킬 수 있습니다 FULLTEXT
그것에 색인 :
CREATE FULLTEXT INDEX ix_content_tags ON content (tags)
, 그러나 색인이 없어도 작동합니다.
이것이 작동하려면 조정해야합니다 @@ft_min_wold_len
태그가 4 자 미만인 경우 태그를 색인하는 것입니다.
다른 팁
MySQL의 정규식을 사용할 수 있습니다.
SELECT * FROM content WHERE tags REGEXP '(^| )selectedtag($| )'
그러나 정규 표현식을 사용하면 오버 헤드가 추가되고 일부 상황에서는 성능이 저하 될 수 있습니다.
또 다른 간단한 방법은 데이터베이스 데이터를 변경할 수있는 경우 첫 번째 태그 이전과 마지막 태그 후에 빈 공간이 있는지 확인하는 것입니다. 약간 비슷합니다 : "코끼리 동물". 그렇게하면 와일드 카드를 사용할 수 있습니다.
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 : 태그 사이에 쉼표를 넣고 Befor와 Afther ",bigelephant,elephant,"
, 그런 다음 사용하십시오 like "%,elephant,%"
WHERE tags LIKE '% '{$selectedtag}' %'
OR tags LIKE ''{$selectedtag}' %'
OR tags LIKE '% '{$selectedtag}''
'%'는 SQL의 와일드 카드입니다. 와일드 카드를 제거하면 정확하게 요구하는 것을 얻을 수 있습니다.
테이블 디자인을 다시 만들지 만 지금은 공간을 사용하여 태그 사이를 구분할 수 있다면 다음을 수행 할 수 있습니다.
SELECT * FROM content WHERE tags LIKE '% elephant %';
공간으로 이끌고 끝내십시오.
다시 한 번, 가장 좋은 옵션은 데이터베이스에서 다수의 관계를 설정하는 것이지만 빠르고 더러운 일회성 수정을 찾고 있다고 생각합니다.