2012-06-25 2 views
2

У меня есть этот следующий запрос для CodeIgniter:CodeIgniter - Группировка, где положение

$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") 

Есть аналогичные вопросы here и here, но thosedid не обеспечивают реального решения для меня.

Как это возможно, Если нет через основные библиотеки, есть ли расширение, которое позволяет записывать такие запросы?

Спасибо,

ответ

1

Вы можете использовать вспомогательный способ запроса CodeIgniter сделать это для этой цели вам придется взломать CodeIgniter. как этот Перейти системы/базы данных/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'); 

Compile выбрать это с истинным параметром. Не будет производить предложение select. Это приведет к образованию

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

Спасибо, я также подумал об использовании подзапросов тогда, но отказался от этого из-за проблем со скоростью. Будет ли использование подзапросов замедлять процесс? – Arda

+0

это я не тестировал, пытаюсь использовать подзапросы, где весь запрос требуется только там, где условие я еще не тестировал. While подзапрос зависит от того, что он замедлит процесс, когда соединение будет выполняться быстрее –

+1

см. Правки сделал это успешно –

Смежные вопросы