2012-05-08 6 views
1
SELECT *, SUM(tbl.relevance) AS relevance FROM 
(
    (
     SELECT q_id, 
     MATCH(a_content) AGAINST ('бутон') AS relevance 
     FROM answers 

     WHERE 
     MATCH(a_content) AGAINST ('бутон') 
    ) 
    UNION 
    (
     SELECT q_id, 
     (MATCH(q_content) AGAINST ('бутон')) * 1.5 AS relevance 
     FROM questions 

     WHERE 
     MATCH(q_content) AGAINST ('бутон') 
    ) 
) AS tbl 

JOIN questions ON questions.q_id = tbl.q_id 

GROUP BY tbl.q_id 
ORDER BY relevance DESC 

答えて

5

CodeIgniterのは現在、アクティブレコードクラスでサブクエリをサポートしていません。

あなたは、単にこれを使用する必要があります:

$this->db->query($your_query, FALSE); 

CodeIgniterのがあなたのクエリを脱出しようとしないように、その第二引数を渡すことを忘れないでください。

0

サブクエリなしでこのクエリを試しましたか?私はleft joinのサブクエリを使用せずにIS NOT NULLを使用することでそれを行うことができると思います。

3

実際には、コード署名者のサブクエリに対する単純なハックがあります。あなたはこの

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

がpublicキーワードを削除し、バージョン2.0以上の変化を使用している場合

あり、次の システム/データベースに行く/ DB_active_rec.phpをしなければならない、あなたはサブクエリ を使用することができます今すぐ

$data = array(
      "q_id", 
      "MATCH(a_content) AGAINST ('?????') AS relevance" 
     ); 

$this->db->select($data); 
$this->db->from("answers"); 
$this->db->where("MATCH(a_content) AGAINST ('?????')"); 
$subQuery1 = $this->db->_compile_select(); 
// Reset active record 
$this->db->_reset_select(); 

unset($data); 
$data = array(
      "q_id", 
      "(MATCH(q_content) AGAINST ('?????')) * 1.5 AS relevance" 
     ); 

$this->db->select($data); 
$this->db->from("questions"); 
$this->db->where("MATCH(q_content) AGAINST ('?????')"); 
$subQuery2 = $this->db->_compile_select(); 
// Reset active record 
$this->db->_reset_select(); 

unset($data); 
$data = array(
      "q_id", 
      "SUM(tbl.relevance) AS relevance" 
     ); 

$this->db->select($data); 
$this->db->from("$subQuery1 UNION $subQuery2"); 
$this->db->join("questions","questions.q_id = tbl.q_id"); 
$this->db->group_by("tbl.q_id"); 
$this->db->order_by("relevance","desc"); 
$query = $this->db->get();