2014-02-13 27 views
2

我有一个存储的ID表以逗号分隔字符串如下:使用像拔出从逗号的ID分隔字符串

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

,我用下面的Active Record构建(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 /行?

希望这是有道理的。

回答

3

则必须在条件

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

它应该是大于0这样$这个 - > DB->其中(“FIND_IN_SET(” $ id',d.field_id_13)> 0“,0); – PravinS

+0

@PravinS。感谢您的建议。但是,如果找到FIND_IN_SET,则返回范围从1到N的值。否则将返回0。所以我们也可以检查'!='。 –

+0

是的,但如果我们使用大于0,那么它将不会返回任何记录,如果在字符串 – PravinS

0

最简单的方法,如果不是最优雅,将逗号添加到开始和ID字段中的值的末尾使用FIND_IN_SET,然后搜索对于由逗号包围的价值也是如此。换句话说:

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(); 
0

FIND_IN_SET解决方案看起来更优雅,但这应该工作,太:

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