【问题标题】:MySQL search for 1,2,3,11,22,33 in fieldMySQL 在字段中搜索 1、2、3、11、22、33
【发布时间】:2010-01-08 03:45:12
【问题描述】:

我可以搜索 1 AND 2 AND 3 而不会因为字段中有 11、22、33 而得到错误匹配吗?

字符串 = "11,22,33" 的字段不应返回任何结果。

【问题讨论】:

    标签: mysql search


    【解决方案1】:

    首先,在字段中使用逗号分隔值是有问题的,您应该考虑将它们存储在单独的表中。然后你可以更有效地获取记录:

    select ...
    from mainTable t
    inner join valueTable v1 on v1.id = t.id and v1.value = 1
    inner join valueTable v2 on v2.id = t.id and v2.value = 2
    inner join valueTable v3 on v3.id = t.id and v3.value = 3
    

    如果这不可能,你必须采用慢速字符串匹配方式。要匹配逗号分隔字符串中的值,可以使用 like 运算符:

    ... where
      concat(',', someField, ',') like '%,1,%' and
      concat(',', someField, ',') like '%,2,%' and
      concat(',', someField, ',') like '%,3,%'
    

    将分隔符放在搜索值的两侧可确保您不会得到任何误报。在字段值之前和之后添加逗号确保您可以找到第一个和最后一个值。

    【讨论】:

    • 是的,正如我所想。使用单独的表是我似乎无法进行我想要的选择。 SELECT * FROM table WHERE id = '1' AND id = '2' AND id = '3'。在这种情况下,该表将是一个数据透视表:id、user_id、option_id
    • @Cudos:​​您可以使用单独的表格轻松获得结果。请参阅我上面添加的查询示例。
    • @Guffa:我也在考虑这样的事情:SELECT t.name FROM maintable t INNER JOIN valueTable v ON v.value IN (1, 2, 3) AND t.id = v.id GROUP BY t.name HAVING COUNT(*) >= 3 虽然我还没有测试过。
    • @R.Bemrose:是的,这也可行,但我认为与使用连接逐渐消除记录相比,它的速度较慢,因为必须对表中的所有记录进行分组。
    【解决方案2】:

    使用正则表达式匹配正则表达式 (^|,)1($|,)(^|,)2($|,)(^|,)3($|,)

    【讨论】:

      【解决方案3】:

      您是否考虑过在您的情况下对值 11 进行最佳搜索会做什么?

      由于无法缩小搜索范围,因此注定要执行表扫描来查找相关值。

      您应该认真考虑将这些值拆分到一个单独的表中,其中每个值有一行,全部链接回原始表中的原始行。

      这会更正确、更高效、更容易处理。

      话虽如此,如果您仍想使用当前的方法,您可以通过以下方式搜索值:

      WHERE ','+ column + ',' LIKE '%,' + value + ',%'
      

      这将在',11,22,33,' 中搜索'%,11,%',注意列和值两端的逗号,这将确保您不会因为部分匹配而得到误报。

      【讨论】:

      • 来自下面的评论:使用单独的表格是我似乎无法进行我想要的选择。 SELECT * FROM table WHERE id = '1' AND id = '2' AND id = '3'。在这种情况下,该表将是一个数据透视表:id、user_id、option_id。你会怎么处理呢?
      • 假设您将字段拆分到一个单独的表中,您的意思是您想要选项 1、2 和 3 都存在的用户,是这样吗?
      • 是的。您是正确的-无论是在您的假设中还是在上面的代码中。但正如你和上面的海报所指出的那样,应该制作一个单独的表格。在看到他的 SELECT 之后,我选择了推荐的解决方案。
      • 同意,这是最好的解决方案。
      【解决方案4】:

      http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

      FIND_IN_SET(1,column) AND FIND_IN_SET(3,column) AND etc;
      

      它被设计为与 SET 类型一起使用,但它也适用于基本的逗号分隔列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2013-05-09
        • 2023-01-13
        • 1970-01-01
        相关资源
        最近更新 更多