使用LIKE从逗号分隔的字符串中提取ID

时间:2014-02-13 10:04:55

标签: mysql sql codeigniter sql-like

我有一个表,用逗号分隔的字符串存储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 /行?

希望这是有道理的。

4 个答案:

答案 0 :(得分:3)

你必须在条件

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

答案 1 :(得分:0)

如果不是最优雅的话,最简单的方法是在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();

答案 2 :(得分:0)

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

将266替换为您的目标ID。

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

答案 3 :(得分:0)

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

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