2009-12-02 6 views
0

im essayant de trouver toutes les mentions du nom d'utilisateur apparié (sam) à partir du code de texte de base de données avec ce qui suit:complexe sql comme expression @user

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

Ceci renverra toutes les lignes utilisateur qui ont été mention à .

mais maintenant le problème est, il renvoie également les lignes avec @ sam3, @ sam-CRV ou tout ce qui est après .. @ Sam

Comment puis-je limiter cela, alors que le nom d'utilisateur spécifique montre du texte et pas tous les sams correspondant .. suivent sont le format de texte dans la base de données, qui est inséré dans la ligne de flux.

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`` 

Répondre

1

Oui, utiliser REGEXP (ou RLIKE), mais attention à l'erreur regex commun de recherche de la fin du choix « jeton » comme un simple commune, niée classe de caractères comme [^A-Za-z0-9] - au lieu utilisez la construction de correspondance "fin de mot" de largeur nulle [[:>:]] (que le moteur de Perl et d'autres regexen inspiré appellent \b).

La classe de caractères niée ne correspond pas à la fin de chaîne:

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) 

où le match de limite de mot succède:

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

Si [[:>:]] n'est pas tout à fait raison pour votre application (car votre jeu de caractères "username" n'est pas ce que le moteur de regex MySQL considère comme un côté d'une limite de mot dans votre locale), vous pouvez, alternativement, spécifier une classe de caractères niée et tester séparément la fin de chaîne:

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

Je recommanderais d'utiliser l'expression rationnelle mysql pour essayer d'obtenir ceci.

Rechercher la chaîne sfor votre texte nécessaire, sans tenir compte certains caractères

suivi à

MySQL Regular Expressions

+0

merci pour le lien, mais a besoin de code exemple qui utilise par exemple @ Sam – Basit

0

Je suis désolé, mais je ne suis pas familier avec MySql.

Dans Microsoft SQL Server, la clause LIKE peut vous permettre de spécifier les champs pour correspondre pas.

Ex: si ('J'aime @spam' LIKE '% @ Spam [^ az]%') SELECT 1

0

select * from table où REGEXP d'alimentation « @ Sam [^ A-Za z0-9] »