我正在两个表之间进行简单的连接-第一个被称为users的表有字段:
||id ||名称||
第二个称为组的表具有相同的字段:
||id ||名称||
它们之间的关系是多方面的,因为一个用户可以在多个组中(感兴趣的),并且一个组将包含多个用户。因此,我有了第三个带有字段的表user_group:
||user_id || group_id ||
其中两个都是foregin键,一个用于用户,另一个用于组。
目标是列出所有小组和每个小组的参与者。为此,我提出了我的疑问:
$q = $this->db->query('SELECT u.name FROM users u
JOIN user_group ug ON u.id = ug.user_id
JOIN groups g ON g.id = ug.group_id WHERE ug.group_id = "4" ');
然后使用活动记录对其进行修改:
$this->db->select('users.name');
$this->db->from('users');
$this->db->join('user_group', 'user_group.user_id = users.id');
$this->db->join('groups', 'groups.id = user_group.group_id');
$this->db->where('user_group.group_id', 3);
$q = $this->db->get();
通过这种方式,我可以通过给定组表中的"id"来获取任何组的用户。但我不知道如何让它同时显示这两个信息——群组的名称和参与的用户。当我从表中创建和删除时,id变得非常无序,我可能有20个组,有些组可能有id=53,所以从1到number_of_groups的jsut循环是不够好的。怎么做?
谢谢Leron
不能在一个查询中获取组以及该组中的用户。您可以在一个查询中获得每个组的串联用户列表
SELECT g.group_name, GROUP_CONCAT(u.fullname)
FROM group g
JOIN user_group ug ON g.id = ug.id
JOIN user u ON ug.user_id = u.id
GROUP BY g.id
组=>用户是多对多关系,因此组中的用户将为用户返回多行。
如果您还需要用户详细信息的列表,而不是串联表单。您可以迭代组列表,然后向users
添加一个键。
$groups = $this->db->get('groups')->result();
foreach($group as &$g){
$this->db->select('users.name');
$this->db->from('users');
$this->db->join('user_group', 'user_group.user_id = users.id');
$this->db->where('user_group.group_id', $g->id);
$g->users = $this->db->get()->result();
}
现在您可以循环使用$group
,并可以使用$group->users
访问用户
请注意,在foreach循环中,&
位于$g
之前。由于foreach对正在传递的变量的副本进行操作,因此您必须将引用传递给它。
只需选择组名,只需别名字段名:
$q = $this->db->query('SELECT u.name, g.name AS `group_name` FROM users u
JOIN user_group ug ON u.id = ug.user_id
JOIN groups g ON g.id = ug.group_id WHERE ug.group_id = "4" ');