2017-01-04 3 views
-1

私のデータベースでハッシュタグを検索するスクリプトがあります。$ tagが定義されていてハッシュタグである特定のものについてs.dataを検索する必要があります。 #peter rhashtag #peterを検索すると#peters #peterson #peterpeterの結果が得られます。どのようにそれだけで正確に#peterより具体的に定義された変数でLIKEを検索する

私が試してみました

REGEXP '[[:<:]]#$tag[[:>:]]' 

を照合結果を検索するが、それがどんな結果を返すdidntのように、私は最後に文字列を切断しません。これが唯一の単語の開始前に一致し、#が単語文字ではないので、

AND s.data REGEXP '#$tag[[:>:]]' 

#[[:<:]]を使用しないでください: は、以下の私の元のコード

$sql = "SELECT s.*, u.avatar 
     FROM status AS s 
     LEFT JOIN users AS u ON u.username = s.author 
     WHERE s.author IN ('$friendsCSV') AND (s.data LIKE '%#$tag%') AND (s.type='a' OR s.type='c' OR s.type='d') 
     ORDER BY s.postdate DESC LIMIT 20"; 
+0

これは有効な正規表現ではありません。 '\\ b#$ tag \\ b'のようなものを試してみてください。 –

+0

@JonathanKuhn MySQLは '\ b'を使用しません。 – Barmar

+0

@Barmar bah、ありがとう。私は今それを見る。 –

答えて

2

てみています。

また、

(s.type='a' OR s.type='c' OR s.type='d') 

が良い書かれたようです:$friendsCSVは、カンマで区切ったリストである場合、あなたはそれを検索するFIND_IN_SETを使用する必要があります

s.type IN ('a', 'c', 'd') 

FIND_IN_SET(s.author, '$friendsCSV') 

IN各値が次の文字列で検索することを期待しています。 ()のリストではなく、コンマを含む単一の文字列ではありません。

+0

私はLIKEも削除する必要がありますか? LIKE REGEXPになります – peter

+1

'LIKE'と' REGEXP'は2つの異なる演算子です。 'LIKE'はワイルドカードパターンを照合するためのもので、' REGEXP'は正規表現の照合のためのものです。 – Barmar

+0

ありがとうございます。ハッシュタグ検索機能はまだ結果を返していません – peter

0

data内のデータが'#tag1#tag2#tag7#tag4'のようなものである場合、この条件は、私がORとインデックスの利点を失うことについて警告したいが、先頭のワイルドカードは、すでに議論の余地がポイントということになり

(data LIKE '%#$tag#%' OR data LIKE '%#$tag')

を動作するはずです。

+0

このように変更しても結果は得られません(s.data LIKE '%#$ tag#%'またはs.data LIKE '%#$ tag') – peter

+0

ハッシュタグが 'data'の最後にある場合にのみ有効です。直後に別のハッシュタグが続きます。 – Barmar

+0

@peter '$ tag'変数の内容は何ですか? – Uueerdo

関連する問題