2017-01-09 97 views
0

所以我試圖編寫一個PHP腳本,但我們只是將它留在SQL的一部分,因爲這是問題出現的地方。我有一個SELECT *查詢,它應該只從用戶ID匹配的行抓取,並且徽章ID符合其用戶ID,後跟下劃線。雖然,這是不應該包含的結果嗎?MySQL查詢LIKE%...%查詢返回其他結果嗎?

這裏是我的SQL查詢:

SELECT * 
FROM `user_badges` 
WHERE `user_id` = 1 
AND `badge_id` LIKE '%1_%' 

這應該只返回啓動/包含1_徽章,這是搶佔了所有那些包含/與1_開始徽章但它也抓住it215。如果我搜索不同的用戶ID(例如我自己的用戶ID),它將抓取所有徽章並使用3_,同時也抓取ACH_RoomDecoFurniCount31,因爲它不包含3_。也許還有更多呢?有人能請我指出正確的方向嗎?

+3

的可能的複製[?爲什麼 「\ _」(下劃線)匹配 「 - 」(連字符)(http://stackoverflow.com/questions/8236818/why -does-underscore-match-hyphen) – baao

+0

_「所以我想編寫一個PHP腳本,但是我們只是把它留在SQL的一部分,因爲這是問題出現的地方」_謝謝!你會驚訝有多少人不這樣做。 –

+0

無論如何,如果你可以在任何地方找到用戶ID,這將無法工作,因爲'%1_%'匹配'31_abc'和'1_abc'。除非您完全(並明確)對用戶標識進行分隔(例如,將其設置爲「僅在開始時」?),否則您將無法獲得明確的匹配。重新考慮您的徽章ID格式。 –

回答

0

_也是SQL通配符 - 一種用於單個字符

0

_替補也是一個通配符。它意味着「任何單個字符」(而%是「任何字符序列」)。

您可以轉義/引用_或使用LOCATE函數代替模式匹配。

WHERE badge_id LIKE '%1\_%' 

WHERE locate('1_', badge_id) > 0 
1

你需要逃脫_,因爲它是通配符。您的查詢會應該是這樣的:

SELECT * 
FROM `user_badges` 
WHERE `user_id` = 1 
AND `badge_id` LIKE '%1\_%' 
+0

乾杯!令人讚歎 – Liam