在 Codeigniter 中按 Id 计算行包括 JSON

Counting Rows Includes JSON by Id in Codeigniter

  1. 我们有一个群组table名称为“群组”(有邮件群组)
  2. 我们有一个人 table 名称为“人”(有些人有 在邮件组中)

我们通过组 ID 将人保存在 table 和 json_encode 的“人”中。因为一个人可以属于多个群体。

问题是我们无法按组计算“人”table 的行数。 我们想要获得一些信息,例如 X 邮件组有 10 人,Y 邮件组有 5 人等。 我们应该通过计算 json 编码的 sql 行来获取带有 id 的信息。但是怎么办?我们需要帮助解决这些问题。

我们的准则;

$jsonGroups = $this->db->get("person")->result();

foreach ($jsonGroups as $jsGro) {

    $jsGro->personEmailGroup = json_decode($jsGro->personEmailGroup);

    if(in_array($group->mailGroupId, $jsGro->personEmailGroup)) {

        $this->db->select('*');
        $query = $this->db->where('personId', $jsGro->personId)->where('personStatus', 1)->get('person');
        $num = $query->num_rows();
        if($num>0) {
            echo ' ' .$num;
        } else {

        }
    }
}

用上面的代码,结果什么都没有。

提前致谢!

将这种设计与 json 用于关系并不是最佳选择,但您可以选择。

假设您的 sql 服务器支持 JSON 函数并且您使用的是 codeigniter 3,这里是使用 JSON_CONTAINS 函数获取成员数量的示例方法

$sub_query = $this->db
                ->select('groups.groupsId,COUNT(*) AS NumberOfPerson')
                ->join('person',"JSON_CONTAINS(person.personEmailGroup, CONCAT('\"',groups.groupsId,'\"'), '$')")
                ->group_by('groupsId')
                ->from('groups')
                ->get_compiled_select();

$allGroups = $this->db
                    ->select('groups.*, personcounter.NumberOfPerson')
                    ->join("($sub_query) personcounter", "personcounter.groupsId= groups.groupsId","left")
                    ->from('groups')
                    ->get()
                    ->result();
echo '<pre>';
print_r($allGroups );
echo '</pre>';

我建议使用分页 insead 来获取所有组。

另一个没有JSON_CONTAINS功能的选项是检查每个用户的组成员资格并计算他们。对于大 person table 使用带有限制和偏移的查询,直到所有 table 被扫描 - 请查看 codeigniter 文档 Limiting Results

// this are all users - not recomended due to memory leak
$users = $this->db->get("person")->result();
// array with group_id as key and group members as value
// will contains only groups with members
$groups_counter = array();
foreach ($users as $user) {
    $user_groups = json_decode($user->personEmailGroup);
    foreach($user_groups as $groupId){
        if(!isset($groups_counter [$groupId])){
            $groups_counter [$groupId] = 1;
        } else {
            $groups_counter[$groupId] += 1;
        }
    }
}

此致