SQL комплекс, как выражение @user - PullRequest
0 голосов
/ 02 декабря 2009

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

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

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

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

как я могу ограничить это, чтобы из текста отображалось только определенное имя пользователя, а не все совпадающие 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``

Ответы [ 4 ]

1 голос
/ 03 декабря 2009

Да, используйте REGEXP (или RLIKE), но следите за распространенной ошибкой регулярного выражения в поиске конца нужного "токена" в качестве обычного класса отрицательных символов, такого как [^A-Za-z0-9] - вместо этого используйте конструкцию соответствия «конец слова» нулевой ширины [[:>:]] (механизм Perl и другие вдохновляющие регулярные выражения известны как \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)

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

SELECT ... WHERE (feed REGEXP '@sam[^A-Za-z0-9]' or feed REGEXP '@sam$')
1 голос
/ 02 декабря 2009

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

Поиск нужного текста в строке s, независимо от выбранных последующих символов

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

0 голосов
/ 03 декабря 2009

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

0 голосов
/ 02 декабря 2009

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

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

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

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