2013-04-30 3 views
1

Я использую Codeigniter и пытаюсь использовать класс Active Record для всех своих операций с базой данных.Как написать предложение HAVING с помощью функции SQL COUNT (DISTINCT column_name) в активной записи Codeigniter?

Однако у меня возникли проблемы при попытке конвертировать последнюю ставку следующего (рабочего) запроса в код активной записи.

$sql = ("SELECT ac.cou_id 
     FROM authorcourse ac 
     INNER JOIN course c 
     ON ac.cou_id = c.cou_id 
     WHERE cou_name = ? // ? = $cou_name 
     AND cou_number = ? // ? = $cou_number 
     AND cou_term = ? // ? = $cou_term 
     AND cou_year = ? // ? = $cou_year 
     AND FIND_IN_SET (ac.aut_id, ?) //? = $aut_ids_string 
     GROUP BY ac.cou_id 
     HAVING COUNT(DISTINCT ac.aut_id) = ? //? = $aut_quantity 
     AND COUNT(DISTINCT ac.aut_id) = (SELECT COUNT(DISTINCT ac2.aut_id) 
              FROM authorcourse ac2 
              WHERE ac2.cou_id = ac.cou_id)"); 
$query = $this->db->query($sql, array($cou_name, $cou_number, $cou_term, $cou_year, $aut_ids_string, $aut_quantity)); 

Вопрос: Как преобразовать предложения HAVING в действительный активный код записи? Я попытался использовать $ this-> db-> having(); и $ this-> db-> distinct(); но не удалось объединить функции для достижения желаемого результата.

Мой (рабочий) код до сих пор:

$this->db->select('ac.cou_id'); 
$this->db->from('authorcourse ac'); 
$this->db->join('course c', 'c.cou_id = ac.cou_id'); 
$this->db->where('cou_name', $cou_name); 
$this->db->where('cou_number', $cou_number); 
$this->db->where('cou_term', $cou_term); 
$this->db->where('cou_year', $cou_year); 
$this->db->where_in('ac.aut_id',$aut_ids); 
$this->db->group_by('ac.cou_id'); 
// missing code 

Спасибо большое!

ответ

0

Вы код кажется довольно неуклюжим. Но, вы можете использовать имея пункт следующим образом:

$this->db->having("ac.aut_id = '".$aut_qty."'", null, false) 
+1

Если это работало на всех, я обеспокоен тем, что это будет уязвим для SQL инъекций, как CI_DB_active_record не раздвигать введенные пользователем данные через CI_DB_driver.escape(), поскольку он все в $ k, а не $ v. – Cheekysoft

+1

Спасибо за ваш ответ, Veekay. Однако это не отвечает на мой вопрос (как преобразовать HAVING COUNT (DISTINCT ac.aut_id) =? ... в действительный активный код записи). – user1894374