phpmysqlcodeigniteractiverecordquery-builder

Get all records first to have a qualifying row with a specified date using CodeIgniter


This code is working perfectly in MySQL:

SELECT employeeCode
FROM employee_details
WHERE employeeCode
IN (
    SELECT DISTINCT (employeeCode) FROM quiz_answer_detailsWHERE submitTime
    IN (SELECT MIN( submitTime ) FROM quiz_answer_details WHERE quizId
    IN (SELECT id FROM quiz_details WHERE uploadtime =  '2014-04-03')
    AND answer IN (SELECT answer FROM quiz_details WHERE uploadtime =  '2014-04-03'))
   )

But I want to use this code on my CodeIgniter, but it is not working.

My CodeIgniter query code is

$this->db->select('employeeCode');
$this->db->from('employee_details');
$this->db->where_in('employeeCode');
$this->db->select('DISTINCT(employeeCode)');
$this->db->from('quiz_answer_details');
$this->db->where_in('submitTime');
$this->db->select('min(submitTime)');
$this->db->from('quiz_answer_details');
$this->db->where_in('quizId');
$this->db->select('id');
$this->db->from('quiz_details');
$this->db->where('uploadtime',"2014-04-03");
$this->db->where_in('answer');
$this->db->select('answer');
$this->db->from('quiz_details');
$this->db->where('uploadtime', "2014-04-03");
$query = $this->db->get();
print_r($query);
if ($query->num_rows >= 1) {
    return $query;
} else {
    return false;
}

What is wrong?


Solution

  • You should re write you subquery and use joins instead to get the better performance,without having full information regarding your tables/relationship and desired result i can't provide you the new query but you can use your subquery in active record's where function

    $subquery=" SELECT DISTINCT (employeeCode) FROM quiz_answer_detailsWHERE submitTime
        IN (SELECT MIN( submitTime ) FROM quiz_answer_details WHERE quizId
        IN (SELECT id FROM quiz_details WHERE uploadtime =  '2014-04-03')
        AND answer IN (SELECT answer FROM quiz_details WHERE uploadtime =  '2014-04-03')) ";
    $this->db->select('employeeCode');
    $this->db->from('employee_details');
    $this->db->where('employeeCode IN('.$subquery.')',null,FALSE);
    $query=$this->db->get();
    

    You should pass third parameter as FASLE in order to prevent the query to be quoted by bacticks Or you can use query() fucntion to run your raw queries

    $query=$this->db->query(' your full query here');
    $query->result();