计数行在 Codeigniter 中按 Id 包括 JSON

Posted

技术标签:

【中文标题】计数行在 Codeigniter 中按 Id 包括 JSON【英文标题】:Counting Rows Includes JSON by Id in Codeigniter 【发布时间】:2021-12-22 06:15:40 【问题描述】:
    我们有一个组表名称为“组”(有邮件组) 我们有一个人表名称为“人”(有些人有 在邮件组中)

我们用 json_encode 按组 ID 将 person 保存在“person”表中。因为一个人可以属于多个群体。

问题是我们无法按组获取“人”表的计数行。 我们想要获取一些信息,例如 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 

        
    

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

提前致谢!

【问题讨论】:

你能看懂吗?或者你认为格式化它是个好主意,这样我们至少可以 如果为时不晚,重构您的数据库以使用适当的范式,然后这些查询将变得非常容易。我会建议一个包含person_id, group_id 的链接表,并且你有一个适当的关系数据库设计。这也将使创建人和组之间的链接变得更加容易 我只想获得工作代码。上面的代码不适用于计算行数。 你用的是什么版本的 mysql 我知道,但我只想用 json 来做。在 person 表中,我认为会有更多的信息并且使用 json 会更好。 【参考方案1】:

对关系使用这种带有 json 的设计并不是最佳选择,但这是您的选择。

假设您的 sql server 支持 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 表,使用带限制和偏移量的查询,直到扫描所有表 - 请查看 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;
        
    

最好的问候

【讨论】:

成功了,谢谢!

以上是关于计数行在 Codeigniter 中按 Id 包括 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在mongodb聚合中按顺序获取计数?

在一个查询中按计数和运算符获取结果

MySQL - 在一个查询中按两列计数[重复]

DataTable - 在控制器中按客户 ID 限制视图

在 CodeIgniter 中按日期过滤 MySQL 条目

如何在codeigniter中按大小过滤产品