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



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

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

我使用以下活动记录构造 (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();

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

这里的替代方案是什么来确保它只返回正确的 ID/行?

希望这是有道理的。

您必须在 where 条件下使用 FIND_IN_SET

$this->db->where("FIND_IN_SET('$id',d.field_id_13 ) !=", 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();

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

将 266 替换为您的目标 ID。

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

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

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

相关内容

  • 没有找到相关文章

最新更新