2016-07-28 8 views
0

Ich habe mehrere ähnliche Themen auf Stackoverflow durchgesehen, die meiner Frage ähnlich sind, aber ich habe nichts gefunden, das mir noch helfen kann. Ich habe diese SQL-Abfrage:MySQL: Suchwort in einer Kommentarzeichenfolge

SELECT * FROM twitter_result 
WHERE LOWER(TweetComment) LIKE LOWER('%lebron james%') 
AND LOWER(TweetComment) LIKE LOWER('%NBA%') 

Ich möchte ein TweetComment suchen, die das Wort „LeBron James“ und „NBA“ bei einer gleichzeitig enthält. Aber diese zwei Worte müssen für sich alleine stehen. Wie es nicht einen Tweet zurückgeben soll, die #LeBron James und #NBA (oder NBATalk)

Zum Beispiel enthält, sollte es einen Tweet wie diese

LeBron James Donates $41 Million To Send 1,100 Kids To College, Becomes 6th Most Charitable Athlete NBA In World

wo Lebron James und NBA stehen allein zurückkehren (keine Zeichen). Ich habe die LOWER dort, um die Groß-/Kleinschreibung zu ignorieren. Jede Hilfe wird sehr geschätzt. Dank

Sorry, ich hinzufügen, vergessen, ich bin gerade SQL in phpMyAdmin

+0

keine Antwort auf Ihre Frage, aber Sie brauchen nicht auf die 'LOWER()' Funktion alle an. – Siyual

+2

Markieren Sie Ihre Frage mit der von Ihnen verwendeten Datenbank. –

+0

Tut mir leid, ich benutze SQL in PHPMyAdmin – Nathan

Antwort

1

Wenn Sie eine regexp Verwendung verwenden möchten,

select * from twitter_result 
where --ignore tweets that contain #lebron james and #nba 
     TweetComment not regexp '.*#lebron james.*|.*#nba.*' 
     --select only those tweets that contain lebron james AND nba 
and TweetComment regexp '[[:<:]]lebron james[[:>:]]' 
and TweetComment regexp '[[:<:]]nba[[:>:]]' 

Alle Muster gesucht wird , müssen explizit angegeben werden, da MySQL standardmäßig keine Lookarounds unterstützt.

Bei der obigen Übereinstimmung wird standardmäßig nicht zwischen Groß- und Kleinschreibung unterschieden. Verwenden Sie regexp binary, wenn bei der Suche die Groß-/Kleinschreibung beachtet werden muss. Fügen Sie nach Bedarf weitere Suchbegriffe hinzu.

Sample fiddle

+0

Danke für Ihren Vorschlag, vkp. Ich habe Ihren Code ein bisschen verdreht und ich habe das: 'SELECT * FROM twitter_result WHERE TweetComment NICHT REGEXP '. * # Lebron james. * |. * # Nba. *' UND TweetComment REGEXP '. * Lebron james. *' UND TweetComment REGEXP '^ nba [[: leer:]] | [[: leer:]] nba [[: leer:]] | | [[: leer:]] nba $' '. Es gibt keinen Tweet, der das Wort NBA am Ende der Zeile enthält, wie dieser Tweet 'RT @TalkingNBAHoops: 1. LeBron James Keine Debatte, bester Spieler im Spiel nba' – Nathan

+0

' TweetComment REGEXP '^ nba [[ : blank:]] | [[: blank:]] nba [[: blank:]] | [[: blank:]] nba $ ''ist nicht erforderlich. Verwenden Sie die * exact * -Abfrage aus der Antwort und Sie sollten die erwartete Zeile als Ergebnis sehen. –

+0

Ich habe versucht, es hat funktioniert, als ob es keine # vor der NBA gibt. Aber einige Tweets, die mit dem Code zurückkommen, enthalten die Wörter '@EstadisticasNBA:', '@ StrictlyNBATalk',' @ _eNBA'. Ich will nur das Wort Lebron James und NBA allein stehen. Irgendwelche Trinkgeld? Ich schätze wirklich für Ihre Hilfe und Zeit. – Nathan

2

Zwar gibt es Lösungen mit regulären Ausdrücken, es ist schwer, eine vorzuschlagen, ohne die Datenbank zu wissen, die Sie verwenden.

Stattdessen können Sie die Tags entfernen Sie nicht wollen, bevor die like tun:

WHERE REPLACE(LOWER(TweetComment), '#lebron james', '') LIKE LOWER('%lebron james%') AND 
     REAPLCE(LOWER(TweetComment), '#nba', '') LIKE LOWER('%NBA%') 
+0

FWIW (und ich weiß, dass Sie wissen, aber nur darauf hindeuten, dass jemand darüber stolpert), "LOWER" sollte nicht benötigt werden, außer OP eine Sortierung verwendet, die Groß- und Kleinschreibung ist – mituw16