2012-06-25 56 views
2

我有这个笨以下查询:笨 - 分组where子句

$q = $this->db->where('(message_from="'.$user_id.'" AND message_to="'.$this->auth_model->userdata['user_id'].'")') 
      ->or_where('(message_from="'.$this->auth_model->userdata['user_id'].'" AND message_to="'.$user_id.'")') 
      ->get('messages'); 

我想写这个查询具有完全的活动记录。

我已经试过这样的事情:

$from_where = array('message_from'=>$user_id, 'message_to'=>$this->auth_model->userdata['user_id']); 
      $to_where = array('message_from'=>$this->auth_model->userdata['user_id'],'message_to'=>$user_id);  
      $q = $this->db->where($from_where) 
      ->or_where($to_where) 
      ->get('messages'); 

      die($this->db->last_query()); 

以上代码生成此查询:

SELECT * FROM (`messages`) WHERE `message_from` = '2' AND `message_to` = '1' OR `message_from` = '1' OR `message_to` = '2' 

但是,这是我想生产什么:

SELECT * FROM (`messages`) WHERE (message_from="2" AND message_to="1") OR (message_from="1" AND message_to="2") 

有类似的问题herehere,但thosedid不提供真正的解决方案为了我。

这怎么可能,如果不是通过核心库,是否有扩展,它允许编写这样的查询?

感谢,

回答

1

可以使用笨的子查询的方式为这个目的做到这一点,你将不得不破解笨。这样 进入系统/数据库/ DB_active_rec.php从这些功能

public function _compile_select($select_override = FALSE) 
public function _reset_select() 

在现已子查询书写删除公共或受保护的关键字,现在这里是有活动记录

$this->db->where('message_from','2'); 
$this->db->where('message_to','1'); 

$subQuery1 = $this->db->_compile_select(); 
$this->db->_reset_select(); 


$this->db->where('message_from','1'); 
$this->db->where('message_to','2'); 

$subQuery2 = $this->db->_compile_select(); 
$this->db->_reset_select(); 

$this->db->select('*'); 
$this->db->where("$subQuery1"); 
$this->db->or_where("$subQuery2"); 
$this->db->get('messages'); 

看看你的查询我的这个答案。这显示了如何使用子查询。这将有助于
Using Mysql WHERE IN clause in codeigniter

EDITES

是的,我已经做了 重写查询这种方式正是你想要

$this->db->where('message_from','2'); 
$this->db->where('message_to','1'); 

$subQuery1 = $this->db->_compile_select(TRUE); 
$this->db->_reset_select(); 


$this->db->where('message_from','1'); 
$this->db->where('message_to','2'); 

$subQuery2 = $this->db->_compile_select(TRUE); 
$this->db->_reset_select(); 

$this->db->select('*'); 
$this->db->where("($subQuery1)"); 
$this->db->or_where("($subQuery2)"); 
$this->db->get('messages'); 

编译选择是正确的参数。不会产生select子句。这将产生

SELECT * FROM (`messages`) WHERE (`message_from` = '2' AND `message_to` = '1') OR (`message_from` = '1' AND `message_to` = '2') 
+0

谢谢,我也考虑过使用子查询,但因为速度问题放弃了它。使用子查询会减慢这个过程吗? – Arda

+0

这个我还没有测试尝试使用子查询,其中只有在条件我还没有测试它的情况下,需要整个查询。如果子查询是相关的,它会减慢进程insted连接会更快地做事 –

+1

查看编辑成功完成 –