2010-02-05 2 views
3

У меня есть поле в моей таблице тегов на некоторое содержание, разделенных пробелами, и в данный момент я использую:MySQL Select Как

SELECT * FROM content WHERE tags LIKE '%$selectedtag%'" 

Но если выбранный тег слон , он будет выбирать содержание маркированного bigelephant и elephantblah и т.д ...

Как я могу получить это просто выбрать то, что я хочу именно?

ответ

5
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 символов, если они у вас есть.

+0

+1: Это правильный путь. –

+0

+1, но теперь у вас есть 2 проблемы :) –

+0

Отлично, спасибо. Это работает отлично (на данный момент), но я определенно собираюсь реструктурировать его в будущем. –

0

Я рассмотрел бы другой дизайн здесь. Это составляет отношение «многие ко многим», поэтому вы можете иметь таблицу tags и таблицу соединений. В общем, атомарность данных избавляет вас от множества головных болей.

Дополнительным преимуществом этого подхода является то, что вы можете переименовать тег без необходимости редактировать каждую запись, содержащую этот тег.

-1

«%» - это подстановочный знак в SQl. Удалите подстановочные знаки, и вы получите именно то, что вы просите.

-1

Redo дизайн таблицы, но сейчас, если вы используете пробелы для разделения между тегами вы можете сделать это:

SELECT * FROM content WHERE tags LIKE '% elephant %'; 

Просто убедитесь, что вы ведете и заканчиваться пробелом, а также (или заменить пространства с запятые, если вы это делаете)

Опять же, лучший вариант - установить отношения «многие-ко-многим» в вашей базе данных, но я подозреваю, что вы ищете быстрое и грязное одноразовое исправление ,

0

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,%"

0
WHERE tags LIKE '% '{$selectedtag}' %' 
     OR tags LIKE ''{$selectedtag}' %' 
     OR tags LIKE '% '{$selectedtag}'' 
1

Вы можете использовать регулярные выражения для MySQL.

SELECT * FROM content WHERE tags REGEXP '(^|)selectedtag($|)' 

Следует помнить, что использование регулярных выражений добавляет накладные расходы и может привести к плохому выполнению в некоторых случаях.

Другим простым способом, если вы можете изменить данные своей базы данных, является обеспечение того, чтобы перед первым тегом и после последнего было пустое пространство; Немного напоминает: «Слон-животное». Таким образом, вы можете использовать подстановочные знаки.

SELECT * FROM content WHERE tags LIKE '% selectedtag %'