Вопрос по sql – Как я могу переписать этот SQL в Active Records CodeIgniter?

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

Ваш Ответ

3   ответа
4

действительно, есть простой взлом для подзапросов в codeigniter. Вы должны сделать следующее Перейти в систему / база данных / DB_active_rec.php

Там, если вы используете версию 2.0 или выше, измените это

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

Удалите общедоступное ключевое слово, и вы сможете использовать подзапросы И сейчас

$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();
5

Codeigniter в настоящее время нет поддержки подзапросов в егоActive Records учебный класс.

Вам просто нужно использовать это:

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

Не забудьте передать второй аргумент, чтобыCodeigniter не пытается скрыть ваш запрос.

0

что вы можете сделать это без использования подзапросов сleft joins и использованиеIS NOT NULL.

Похожие вопросы