【问题标题】:MySQL query LIKE %...% query returning other results?MySQL 查询 LIKE %...% 查询返回其他结果?
【发布时间】:2017-05-24 08:43:30
【问题描述】:

所以我正在尝试编写一个 PHP 脚本,但我们将把它留在 SQL 部分,因为这是出现问题的地方。我有一个SELECT * 查询,它应该只从用户 ID 匹配的行中获取,并且徽章 ID 符合他们的用户 ID,后跟下划线。虽然,它抓住了不应该包括在内的结果?

这是我的 SQL 查询:

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

这应该只返回以1_ 开头/包含的徽章,它会抓取所有包含/以1_ 开头的徽章,但它也会抓取it215。如果我搜索不同的用户 ID,例如我自己的,它会抓取所有带有 3_ 的徽章,并且它还会抓取 ACH_RoomDecoFurniCount31,这令人困惑,因为它不包含 3_。也许还有更多?有人可以指出我正确的方向。

【问题讨论】:

  • “所以我正在尝试编写一个 PHP 脚本,但我们将把它留在 SQL 部分,因为这是出现问题的地方” 谢谢!你会惊讶于有多少人不这样做。
  • 如果您可以在任何地方找到用户 ID,这无论如何都行不通,因为 %1_% 匹配 31_abc 以及 1_abc。除非您完全(并且明确地)分隔用户 ID(例如,将其设为“仅在开头”?),否则您将无法获得明确的匹配。重新考虑您的徽章 ID 格式。

标签: mysql


【解决方案1】:

_ 也是 SQL 中的通配符 - 单个字符的替代品

【讨论】:

    【解决方案2】:

    _ 也是一个通配符。它的意思是“任何单个字符”(而% 是“任何字符序列”)。

    您可以转义/引用 _ 或使用 LOCATE 函数而不是模式匹配。

    WHERE badge_id LIKE  '%1\_%'
    
    WHERE locate('1_', badge_id) > 0
    

    【讨论】:

      【解决方案3】:

      _ 是通配符“_ 与一个字符完全匹配”。所以你说的是: % :以任何东西(或什么都没有)开始 1:包含 1 _: 正好是 1 的 %(或任何东西,或什么都没有)

      http://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html

      【讨论】:

        【解决方案4】:

        您需要转义 _,因为它是一个通配符。您的查询应该是这样的:

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

        【讨论】:

        • 为此干杯!效果惊人:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 2013-11-07
        相关资源
        最近更新 更多