在CodeIgniter中,按三列分组无法正常工作。

7

我需要一个按三列分组的结果,SQL没有任何问题地完美工作。但是,当我在CodeIgniter框架中使用它时,出现了问题,查询无法执行。以下是我的代码和SQL。

代码

$this->db->select(['trk.userid AS user_id', 'scr.course AS course_id'])
                     ->from('mdl_scorm scr')
                     ->join('mdl_scorm_scoes_track trk', 'scr.id = trk.scormid', 'inner')
                     ->join('mdl_course_modules mcs', 'mcs.instance = scr.id', 'inner')
                     ->where_in('trk.value', ['completed','incomplete','passed'])
                     ->group_by(['scr.course', 'trk.userid', 'trk.scormid'])
                     ->order_by('trk.userid', 'DESC');

SQL

SELECT `trk`.`userid` AS user_id, `scr`.`course` AS course_id 
FROM (`mdl_scorm` scr) 
INNER JOIN `mdl_scorm_scoes_track` trk ON `scr`.`id` = `trk`.`scormid` INNER JOIN `mdl_course_modules` mcs ON `mcs`.`instance` = `scr`.`id` 
WHERE `trk`.`value` IN ('completed', 'incomplete', 'passed') 
GROUP BY `scr`.`course`, `trk`.`userid`, `trk`.`scormid` 
ORDER BY `trk`.`userid` DESC LIMIT 0,100;

当group_by只有两列时,如下所示,此方法可以正常工作:

->group_by(['scr.course', 'trk.userid'])

可能的原因是什么?
4个回答

11

在CodeIgniter中,group_by()仅支持两个字段。


$this->db->group_by()

允许您编写查询语句的GROUP BY部分:

$this->db->group_by(array("title", "date"));  // Produces: GROUP BY title, date

CI 3 group_by()


Edit 01

$query=$this->db->query("
        SELECT `trk`.`userid` AS user_id, `scr`.`course` AS course_id 
        FROM `mdl_scorm` scr 
        INNER JOIN `mdl_scorm_scoes_track` trk 
        ON `scr`.`id` = `trk`.`scormid` 
        INNER JOIN `mdl_course_modules` mcs 
        ON `mcs`.`instance` = `scr`.`id` 
        WHERE `trk`.`value` IN ('completed', 'incomplete', 'passed') 
        GROUP BY `scr`.`course`, `trk`.`userid`, `trk`.`scormid` 
        ORDER BY `trk`.`userid` 
        DESC LIMIT 0,100;");

$result = $query->result_array();
return $result;

@Vaishak 有任何意见吗? - Abdulla Nilam
我尝试了@Drew建议的使用原始查询的方法,但那也不起作用。问题出现在$result = $query->result();或者$result = $query->row_array();这两行代码。 - Vaishak
所以问题不在执行查询的层面,而是在检索结果时,我猜测。 - Vaishak
是的,我也尝试了相同的方法。看一下_$query_返回的值。 CI_DB_mysql_result Object ( [conn_id] => Resource id #2 [result_id] => Resource id #6 [result_array] => Array ( ) [result_object] => Array ( ) [custom_result_object] => Array ( ) [current_row] => 0 [num_rows] => 100 [row_data] => ) @Abdulla, @Drew - Vaishak
内存限制是否导致了问题?基本上,当我们使用group_by时,它应该减少列的数量,对吧?例如:当我使用GROUP BY scr.course, trk.userid时,结果约为25,而当我使用GROUP BY scr.course, trk.userid, trk.scormid时,结果大约增加了一倍!! - Vaishak
显示剩余2条评论

3
考虑在模型中执行原始查询。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class xyz_model extends CI_Model{
     function __construct()
     {
          // Call the Model constructor
          parent::__construct();
     }

     function get_this_thing($month,$year) 
     {    $myQuery="SELECT `trk`.`userid` AS user_id, `scr`.`course` AS course_id 
          FROM `mdl_scorm` scr 
          INNER JOIN `mdl_scorm_scoes_track` trk 
          ON `scr`.`id` = `trk`.`scormid` 
          INNER JOIN `mdl_course_modules` mcs 
          ON `mcs`.`instance` = `scr`.`id` 
          WHERE `trk`.`value` IN ('completed', 'incomplete', 'passed') 
          GROUP BY `scr`.`course`, `trk`.`userid`, `trk`.`scormid` 
          ORDER BY `trk`.`userid` 
          DESC LIMIT 0,100;";

          $query = $this->db->query($myQuery);

          $result = $query->result();
          return $result;
     }
}

不,这也不起作用。代码停在$result = $query->result();处。 - Vaishak
1
我们在谈论什么表格大小。我知道有些人的查询需要一个小时才能运行。这就是我遇到他们的方式。我假设你的查询在你谈论分组中的3列或尝试让一个raw工作之前已经可以正常工作,否则使用CI将会很棘手或不可能。 - Drew
可能是由于内存限制,我无法得到预期的结果。我不得不调整查询和内存/缓存限制以获得预期的结果。 - Vaishak

1
你也可以传递一个包含多个值的数组:
$this->db->group_by(array("title", "date"));  // Produces: GROUP BY title, date

源链接


0
使用结果数组而不是像那样的结果。
return $query->result_array();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接