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

问题是我们不能按组计算"person“表的行数。我们想得到一些信息,比如X邮件组有10个人,Y邮件组有5人等等。我们应该通过计算json编码的sql行来获得这些信息。但是怎么做呢?在这些问题上,我们需要帮助。
我们的守则;
$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 {
}
}
}有了上面的代码,结果就什么都没有了。
提前感谢!
发布于 2021-11-11 12:14:01
将这种设计与json一起用于关系不是最优的,而是您的选择。
假设您的sql server支持JSON函数,并且您正在使用codeigniter 3,下面是使用包含函数获取成员数的示例方法
$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表,请使用有限制和偏移的查询,直到所有表都被扫描--请查看代码点火器文档极限结果。
// 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;
}
}
}诚挚的问候
https://stackoverflow.com/questions/69899869
复制相似问题