【问题标题】:Using LIKE to pull out an ID from comma separated string使用 LIKE 从逗号分隔的字符串中提取 ID
【发布时间】:2014-02-13 10:04:54
【问题描述】:

我有一个表格,它以逗号分隔的字符串存储 ID,如下所示:

field_id_13
------------
1234,5266,3678,4733,7372,5766,2578

我正在使用以下 Active Record Construct (CI) 来提取数据:

$this->db->select("*")
    ->from("channel_data d")
    ->join("channel_titles t","t.entry_id=d.entry_id")
    ->where("d.field_id_13 LIKE '%".$id."%'")
    ->where("t.status","open")
    ->get();

问题是,有时在我的搜索中,会返回“266”的 ID,因此 - 因为我围绕子句的 % 正在返回与“5266”匹配的结果。

这里有什么替代方法来确保它只返回正确的 ID/Rows?

希望这是有道理的。

【问题讨论】:

    标签: mysql sql codeigniter sql-like


    【解决方案1】:

    你必须在 where 条件下使用 FIND_IN_SET

    $this->db->where("FIND_IN_SET('$id',d.field_id_13 ) !=", 0);
    

    【讨论】:

    • 应该大于 0 像这样 $this->db->where("FIND_IN_SET('$id',d.field_id_13) > 0", 0);
    • @PravinS。谢谢你的建议。但是,如果找到,FIND_IN_SET 返回一个 1 到 N 范围内的值。否则将返回 0。所以我们也可以查看!=
    • 是的,但是如果我们使用大于0,那么它不会返回任何记录,如果在字符串中没有找到值
    • @PravinS。两者都是一样的:-)
    【解决方案2】:

    最简单的方法,如果不是最优雅的,就是在 id 字段的值的开头和结尾添加逗号,然后搜索用逗号包围的值。换句话说:

    field_id_13
    ------------
    ,1234,5266,3678,4733,7372,5766,2578,
    

    和:

    $this->db->select("*")
        ->from("channel_data d")
        ->join("channel_titles t","t.entry_id=d.entry_id")
        ->where("d.field_id_13 LIKE '%,".$id.",%'")
        ->where("t.status","open")
        ->get();
    

    【讨论】:

      【解决方案3】:

      SELECT * FROM your_table WHERE field_id_13 REGEXP ('^266,|,266,|266$')

      将 266 替换为您的目标 ID。

      http://sqlfiddle.com/#!2/e6a74/1

      【讨论】:

        【解决方案4】:

        FIND_IN_SET 解决方案看起来更优雅,但这也应该有效:

        ->where("d.field_id_13 REGEXP '[[:<:]]{$id}[[:>:]]'")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 2020-03-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多