嘿..我在我的sql-query中使用了几个“like”遇到了问题(用Codeigniter的activerecord生成):
SELECT * FROM (`posts`) WHERE `city` LIKE '%test%' AND `title` LIKE '%%' OR `text` LIKE '%%'
事情是,它似乎读取这个查询,就好像第一个像第二个像第二个像是一个括号,但我希望在第二个和最后一个周围有一个括号(我希望它比较,如果上一个或下一个到最后的作品)。
如何使用Codeigniter的Active Record类实现这一目标?
当前代码: if($ type!= 0) $ this-> db-> where('type',$ type);
$this->db->like('city', $area);
$this->db->like('title', $words);
$this->db->or_like('text', $words);
return $this->db->get('posts')->result_array();
答案 0 :(得分:4)
我不认为CI正在添加任何paranthesis。它会在前两个语句之间添加一个“AND”,在最后两个语句之间添加一个“OR”。为了实现你想要的,我会写自己的陈述。这非常简单。
$sql = SELECT * FROM 'posts' WHERE city LIKE ? AND ( title LIKE ? OR text LIKE ? );
$query = $this->db->query($sql, array($area, $words, $words));
注意我是如何使用绑定的。这会自动为您转义字符。
答案 1 :(得分:1)
这将解决问题
$this->db->select('*')->from('my_table')
->group_start()
->where('a', 'a')
->or_group_start()
->where('b', 'b')
->where('c', 'c')
->group_end()
->group_end()
->where('d', 'd')
->get();
// Generates:
// SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'
答案 2 :(得分:0)
当您必须使用表连接时,请尝试以下方法
public function get_all_airports($para) {
$this->db->select('airports.name as air_name, airports.city, airports.type, airports.home_link, country.name as con_name');
$this->db->from('airports');
$this->db->join('country', 'airports.iso_country = country.code', 'inner');
$this->db->where("airports.type !=", "small_airport");
$this->db->where("airports.type !=", "closed");
$this->db->where("airports.type !=", "heliport");
$this->db->where("airports.type !=", "medium_airport");
$this->db->where("airports.type !=", "seaplane_base");
$where = "(country.name LIKE '%$para%' OR airports.city LIKE '%$para%')";
$this->db->where($where);
echo json_encode($this->db->limit(20)->get()->result());
}