Как я могу отфильтровать результаты MySQL по их содержанию? т.е. если содержит хэштеги

Просто хочу знать, как я могу отфильтровать результат с помощью mysql, если поле «контент» содержит хэштег.

например Если результат будет таким: «# Euro2012 будет отличным»

Я бы не вернул это в моих результатах MySQL ....

заранее спасибо


person André Figueira    schedule 10.05.2012    source источник


Ответы (2)


Для полей varchar вы можете использовать LIKE:

SELECT * FROM myTable WHERE myVarCharField NOT LIKE '%#Euro2012%'

Для текстовых полей вам необходимо изучить полнотекстовый поиск.

Обновление (предложено в комментариях):

Решение с регулярным выражением:

SELECT * FROM myTable WHERE myVarCharField NOT RLIKE '#.*\s'

Если вы хотите выполнить фильтрацию по полям, которые начинаются с хэштега, добавьте ^ к регулярному выражению.

person Mike B    schedule 10.05.2012
comment
Дело в том, что это должно быть динамическое, я не знаю, что это за хэштег ... Так что-то вроде регулярного выражения? - person André Figueira; 10.05.2012
comment
@ AndréFigueira: Есть RLIKE. - person Rocket Hazmat; 10.05.2012
comment
Вам, вероятно, следует добавить NOT перед LIKE, так как мы не хотим видеть ничего, содержащего хэштег. - person Darvex; 10.05.2012
comment
чтобы отфильтровать, используйте NOT LIKE - person sreimer; 10.05.2012
comment
@MikeB Я бы знал только, что он начинается с хэштега и заканчивается пробелом. - person André Figueira; 10.05.2012
comment
@MikeB Спасибо, но это избавило от некоторых результатов, есть еще несколько, которые не были удалены из результатов. - person André Figueira; 10.05.2012
comment
@ AndréFigueira Как выглядят пропущенные результаты? - person Mike B; 10.05.2012
comment
Привет, Майк, я поигрался с ним с помощью REGEX, похоже, это работает: SELECT * FROM status WHERE content NOT RLIKE '# [0-9a-zA-Z]' - person André Figueira; 10.05.2012
comment
@ AndréFigueira Это выражение не будет соответствовать хэштегу и будет заканчиваться пробелом. Если пробел не является обязательным, вы можете использовать #.*\s? - person Mike B; 10.05.2012

Используя regex и preg_match_all(), у вас может получиться что-то вроде этого:

$str = <<<STR
this is a string
with a #tag and
another #hello one
STR;

$matches = array();
if (preg_match_all('/#([^\s]+)/', $str, $matches)) {
  var_dump($matches[1]);
}

Что дает следующий результат:

array
  0 => string 'tag' (length=3)
  1 => string 'hello' (length=5)

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

person Herbert Musoke    schedule 14.12.2012