我有一个表,它将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}[[:>:]]'")