在 Codeigniter 中按 Id 计算行包括 JSON
Counting Rows Includes JSON by Id in Codeigniter
- 我们有一个群组table名称为“群组”(有邮件群组)
- 我们有一个人 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;
}
}
}
此致
- 我们有一个群组table名称为“群组”(有邮件群组)
- 我们有一个人 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;
}
}
}
此致