【问题标题】:PHP MYSQL - Search comma separated list with a comma separated listPHP MYSQL - 使用逗号分隔列表搜索逗号分隔列表
【发布时间】:2013-07-03 03:33:39
【问题描述】:

亲爱的 Stackoverflowers,

我有一个 mysql 查询,它检查某些子类别是否是 categoryID 的一部分,以显示主类别中子类别的所有产品。

例如:

  1. 类别
    • 子类别 1
    • 子类别 2
    • 子类别 3

例如,产品被添加到 subcats 中,但所有beeing 都显示在 head 类别中。 这很好用,我用 WHERE cID in (' . $subids . ') 来做到这一点

但现在来了,cID 过去只保存一个值,但由于必须可以将产品添加到多个类别,我现在将多个选定的 id 保存为 cID 字段中的逗号分隔。

所以我正在寻找一种方法来从逗号分隔列表中的逗号分隔列表中找到匹配项,因为 cID 现在已成为逗号分隔 ID,而 FIND_IN_SET 不适用于此。

希望有人能发光,谢谢大家!

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我现在将多个选定的 id 保存为 cID 字段中的逗号分隔。那是一个非常糟糕的方法,为什么要将 CSV 存储在单个字段中,您必须更改设计,制作一个单独的表,其中每个值都有一个新行并将映射到 FK。

    你真正需要做的,是研究你的数据库设计,阅读规范化和其他相关主题,我已经添加了一些链接,

    1. MSDN Link on Many to Many
    2. Databae Normalization

    【讨论】:

      【解决方案2】:

      在单个字段中存储 CSV 不是一个好主意。搜索需要使用 LIKE 子句。

      where CID LIKE '$cid1,' or CID LIKE ',$cid1,' or CID LIKE ',$cid1' or 
            CID LIKE '$cid2,' or CID LIKE ',$cid2,' or CID LIKE ',$cid2' or
            .... so on
      

      FIND_IN_SET 也可以。

      where FIND_IN_SET( $cid1, CID ) OR FIND_IN_SET($cid2, CID) .. so on
      

      【讨论】:

        【解决方案3】:

        在数据库中的该列上添加全文搜索索引,然后使用以下sql查询 参考 - http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

        【讨论】:

          【解决方案4】:

          阅读以下内容:

          与逗号分隔值相反,实现这一点可能会为您和您的同事省去很多麻烦并简化您的查询,从而有效地消除复杂查询的需要。它也应该更快。

          【讨论】:

          • 只是为了提供更多帮助,如果您实现多对多数据模型,您的查询可能看起来像这样:SELECT * FROM table_a LEFT JOIN junction_table ON table_a.cID = junction_table.cID WHERE junction_table.subid IN ( $subids ) 您可能还想添加GROUP BY table_a.primary_key,这样您就可以得到一个不同的即使有多个匹配的子 ID,也要从 table_a 记录。
          猜你喜欢
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-08
          • 2012-03-03
          相关资源
          最近更新 更多