计数行在 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的主要内容,如果未能解决你的问题,请参考以下文章