MySQL Выбрать Нравится - PullRequest
       2

MySQL Выбрать Нравится

3 голосов
/ 05 февраля 2010

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

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

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

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

Ответы [ 7 ]

5 голосов
/ 05 февраля 2010
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 символов, если они у вас есть.

1 голос
/ 05 февраля 2010

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

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

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

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

SELECT * FROM content WHERE tags LIKE '% selectedtag %'
0 голосов
/ 05 февраля 2010
WHERE tags LIKE '% '{$selectedtag}' %'
      OR tags LIKE ''{$selectedtag}' %'
      OR tags LIKE '% '{$selectedtag}''
0 голосов
/ 05 февраля 2010

A: Вы должны создать отдельную таблицу тегов, которая указывает на контент с contentid и содержит ключевое слово, затем:

select a.*
from content a,tags b
where a.id=b.contentid
group by a.id;

B: Поместите запятую между тегами и перед ними, как ",bigelephant,elephant,", затем используйте like "%,elephant,%"

0 голосов
/ 05 февраля 2010

Повторите дизайн таблицы, но сейчас, если вы используете пробелы для разделения между тегами, вы МОЖЕТЕ сделать это:

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

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

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

0 голосов
/ 05 февраля 2010

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

0 голосов
/ 05 февраля 2010

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

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

...