Я использую 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
Спасибо большое!
Если это работало на всех, я обеспокоен тем, что это будет уязвим для SQL инъекций, как CI_DB_active_record не раздвигать введенные пользователем данные через CI_DB_driver.escape(), поскольку он все в $ k, а не $ v. – Cheekysoft
Спасибо за ваш ответ, Veekay. Однако это не отвечает на мой вопрос (как преобразовать HAVING COUNT (DISTINCT ac.aut_id) =? ... в действительный активный код записи). – user1894374