문제

내 컨텐츠에 대한 태그에 대한 필드에 필드가 있으며 공간으로 분리되어 있으며 현재 사용하고 있습니다.

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 %';

공간으로 이끌고 끝내십시오.

다시 한 번, 가장 좋은 옵션은 데이터베이스에서 다수의 관계를 설정하는 것이지만 빠르고 더러운 일회성 수정을 찾고 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top