代码之家  ›  专栏  ›  技术社区  ›  ninu

SQL中的多个相似项

  •  3
  • ninu  · 技术社区  · 16 年前

    我想搜索多行并获取包含特定项目的行。

    MySQL中的表是设置好的,因此每行的每个ID都有一个唯一的值列表(逗号分隔)。

    前任:

    id | order
    1  | 1,3,8,19,34,2,38
    2  | 4,7,2,190,38
    

    现在,如果我想拉只包含数字19的那一行,我该怎么做呢?我可以在列表中找到类似条件的可能性是:

    19,     <-- 19 at the start of the list
    ,19     <-- 19 at the end of the list
    ,19,    <-- 19 inside the list
    

    我尝试了以下方法,但无法获得任何结果,感谢您的帮助!

    SELECT *
    FROM categories
    WHERE order LIKE '19,%' OR '%,19%' OR '%,19%'
    LIMIT 0 , 30
    
    2 回复  |  直到 14 年前
        1
  •  6
  •   Mark Byers    16 年前

    你可以使用 FIND_IN_SET 以更简单的方式解决问题:

    SELECT *
    FROM categories
    WHERE FIND_IN_SET('19', `order`)
    LIMIT 0, 30
    

    一般来说,尽管您应该尝试设计数据库,这样就不需要这种类型的操作。

        2
  •  7
  •   Lasse V. Karlsen    16 年前

    首先,您不应该像这样存储值,您应该使用一个子表,每个项目有一行,这将使您当前的查询更容易处理,并允许使用索引。

    既然这样说了,你想要的是:

    WHERE ',' + order + ',' LIKE '%,19,%'
    

    order 字段,您可以用每边的逗号查询该字段中所需的值,而不必处理值是列表中第一个或最后一个值的特殊情况。

    有了您列出的查询,您就可以通过认识到 OR 不会给 LIKE 子句,它将完全不同的子句分开,从而像这样重写SQL:

    WHERE order LIKE '19,%' OR order LIKE '%,19,%' OR order LIKE '%,19'
                               ---+------      ^     ----+-----       ^
                                  |            |         |            |
                                  +- add this -+---------+            +- removed
                                                                         percent
    

    注释 第二个模式中缺少的逗号将与包含值19的字符串匹配,并注意最后一个模式中删除的百分比字符,这将允许它与以19结尾的列表匹配。