首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Codeigniter中,计数行按Id包括JSON

在Codeigniter中,计数行按Id包括JSON
EN

Stack Overflow用户
提问于 2021-11-09 14:25:33
回答 1查看 62关注 0票数 0
  1. 我们有一个组表名为“group”(有邮件组)
  2. 我们有一个人表名为" person“(有些人在邮件组中)

我们通过组ID在" person“表中使用json_encode保存了人,因为一个人可以属于多个组。

问题是我们不能按组计算"person“表的行数。我们想得到一些信息,比如X邮件组有10个人,Y邮件组有5人等等。我们应该通过计算json编码的sql行来获得这些信息。但是怎么做呢?在这些问题上,我们需要帮助。

我们的守则;

代码语言:javascript
复制
$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 {

        }
    }
}

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

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 12:14:01

将这种设计与json一起用于关系不是最优的,而是您的选择。

假设您的sql server支持JSON函数,并且您正在使用codeigniter 3,下面是使用包含函数获取成员数的示例方法

代码语言:javascript
复制
$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表,请使用有限制和偏移的查询,直到所有表都被扫描--请查看代码点火器文档极限结果

代码语言:javascript
复制
// 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;
        }
    }
}

诚挚的问候

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69899869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档