2017-01-09 129 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