SQL комплекс, как выражение @user

0

im, пытаясь найти все упоминания совпадающего имени пользователя (sam) из текстового кода базы данных со следующим:

$sql = "select * from tweet where feed like '%@sam%'";

это вернет все строки, о которых упоминал пользователь.

но теперь проблема в том, что она также возвращает строки с @sam3, @sam-dadf или что-то, что после @sam..

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

 1. i been out with @sam today, but im
    not sure what we should do
 2. we head great party today and all the frineds were invited, such as @sam, @jon, @dan...
 3. i been out today with @samFan and with @dj. << this row should not get pull from database``
Теги:
database
expression

4 ответа

1
Лучший ответ

Да, используйте REGEXP (или RLIKE), но следите за общей ошибкой регулярного выражения, ища конец желаемого "токена" как просто общий, отрицаемый класс символов, например [^A-Za-z0-9] - вместо используйте конструкцию соответствия "конец слова" с нулевой шириной [[:>:]] (какой движок perl и другое вдохновленное regexen знают как \b).

Отключенный класс символов не может совпадать в конце строки:

mysql> SELECT 'I am @sam' REGEXP '@sam[^A-Za-z0-9]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
|                0 | 
+------------------+
1 row in set (0.00 sec)

где совпадение с символом слова преуспевает:

mysql> SELECT 'I am @sam' REGEXP '@sam[[:>:]]' AS "Does This Match?";
+------------------+
| Does This Match? |
+------------------+
|                1 | 
+------------------+
1 row in set (0.00 sec)

Если [[:>:]] не совсем подходит для вашего приложения (поскольку ваш набор символов "имя пользователя" не является тем, что движок регулярного выражения MySQL считает одной стороной границы слова в вашей локали), вы также можете указать отрицательный класс символов и отдельный тест для конца строки:

SELECT ... WHERE (feed REGEXP '@sam[^A-Za-z0-9]' or feed REGEXP '@sam$')
1

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

Найдите строку sfor требуемого текста, не считая выбранных символов повтора

Регулярные выражения MySQL

  • 0
    спасибо за ссылку, но нужен пример кода, который использует пример @sam
0

выберите * из таблицы, где канал REGEXP '@sam [^ A-Za-z0-9]'

0

Извините, но я не знаком с MySql.

В Microsoft SQL Server предложение Like может позволить вам указать поля, которые НЕ соответствуют.

Пример: if ('Мне нравится @Spam.' LIKE '% @Spam [^ a-z]%') SELECT 1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню