Mysql:跨五个表连接

Mysql:跨五个表连接,mysql,sql,join,Mysql,Sql,Join,我有一个mysql数据库(省略与此问题无关的字段) 我在一个数组中有一组用户ID,称为“用户ID” 对于每个用户ID,我希望通过 user -> user_group_teachers -> user_groups -> user_group_members -> pupils 协会。也就是说,一些表格之间的连接 所以,我想得到一些行看起来像的结果 [1, [6,7,8,9]] 其中1为教师id,[6,7,8,9]为学生id。我只希望每个学生id在第二个列表中出现一次

我有一个mysql数据库(省略与此问题无关的字段)

我在一个数组中有一组用户ID,称为“用户ID”

对于每个用户ID,我希望通过

user -> user_group_teachers -> user_groups -> user_group_members -> pupils
协会。也就是说,一些表格之间的连接

所以,我想得到一些行看起来像的结果

[1, [6,7,8,9]]
其中1为教师id,[6,7,8,9]为学生id。我只希望每个学生id在第二个列表中出现一次

谁能告诉我如何在尽可能少的查询中(或者更广泛地说,尽可能高效地)完成这项工作。在用户ID中,我通常会有1000到10000个ID

我在一个ruby脚本中实现了这一点,因此可以在查询之间将结果存储为变量(数组或散列),如果这样做可以使事情更简单的话

谢谢!最大值 为Lyhan编辑

谢谢,但是你的解决方案似乎不起作用。例如,在结果的第一行中,使用您的方法

| user_id | group_concat(pupils.id separator ",")                                                                         
|       1 | 2292   
但是,如果我以缓慢、逐步的方式获得相关的瞳孔ID,那么我会得到不同的结果:

select group_concat(user_group_teachers.user_group_id separator ",") 
from user_group_teachers 
where user_group_teachers.teacher_id = 1 
group by user_group_teachers.teacher_id;
我明白了

将这些值(用户组ID)插入到另一个查询中:

select group_concat(user_group_members.pupil_id separator ",") 
from user_group_members 
where user_group_members.user_group_id in (12,1033,2117,2280,2281) 
group by user_group_members.user_group_id;
我明白了


顺便说一句,感谢小组讨论的方法,这很方便:)

我在上面做了一些评论,这些评论对于解决这个问题很重要,但我想你可以从这两个问题开始,看看它是否能让你走得足够远,从而得到你需要的东西

要为所有组的学生获取教师的有序列表,可以执行以下操作:

select distinct t.teacher_id, m.pupil_id
from user_groups g
    inner join user_group_teachers t
        on t.user_group_id = g.id
    inner join user_group_members m
        on t.user_group_id = g.id
order by t.teacher_id, m.pupil_id
select g.id, t.teacher_id, m.pupil_id
from user_groups g
    inner join user_group_teachers t
        on t.user_group_id = g.id
    inner join user_group_members m
        on t.user_group_id = g.id
order by g.id, t.teacher_id, m.pupil_id
要为与tact中的组有关系的学生获取教师的有序列表,您可以执行以下操作:

select distinct t.teacher_id, m.pupil_id
from user_groups g
    inner join user_group_teachers t
        on t.user_group_id = g.id
    inner join user_group_members m
        on t.user_group_id = g.id
order by t.teacher_id, m.pupil_id
select g.id, t.teacher_id, m.pupil_id
from user_groups g
    inner join user_group_teachers t
        on t.user_group_id = g.id
    inner join user_group_members m
        on t.user_group_id = g.id
order by g.id, t.teacher_id, m.pupil_id
您必须遍历这些结果集并将其转换为嵌套数组,但这是您需要的数据

更新:更新:如果数据集太大或您不想遍历单个结果集,则可以这样做以模拟上面第一个查询的结果,并基于查询结果集构建子数组:

/* Use this query to drive the batch */
select distinct t.teacher_id
from user_groups_teachers t
order by t.teacher_id

/* Inside a loop based on first query result, pull out the array of pupils for a teacher */
select distinct m.pupil_id
from user_groups_members m
    inner join user_groups g
        on g.id = m.user_group_id
    inner join user_groups_teachers t
        on t.user_group_id = g.id
where t.teacher_id = /* parameter */
order by m.pupil_id

这就是我想到的:

    select pupil_group_teachers.teacher_id, group_concat(pupil_group_members.pupil_id separator ',') 
    from pupil_group_teachers join pupil_groups on pupil_group_teachers.pupil_group_id = pupil_groups.id
    join pupil_group_members on pupil_group_members.pupil_group_id = pupil_groups.id
    group by pupil_group_teachers.teacher_id;

它似乎有效,而且速度非常快。Lyhan(后来删除了他的答案)和David Fleeman都帮我找到了答案。大家好。

我觉得有一个“用户”表和一个“学生”表有点奇怪。这有什么原因吗?另外,我想指出,您要求的只是这三个表:用户组、用户组教师和用户组成员。另一个问题,您的db允许用户组有多个教师-这会影响您希望返回数据的方式吗?你愿意看到[1,2],[6,7,8,9],还是将其作为两个单独的结果,如[1,6,7,8,9],[2,6,7,8,9]?@davidfleman我可以看到一个场景,其中有许多用户,但只有一些是学生,你需要存储其他类型用户不需要的学生信息。也可能是学生根本不是用户,只有教职员工可以访问。用户和学生是两个不同的实体:用户实际上是教师,而学生是学生。是的,我理解,我可能应该删除这个评论,因为让我感到困惑的是,对于被问到的问题,学生和用户表似乎是不必要的。
    select pupil_group_teachers.teacher_id, group_concat(pupil_group_members.pupil_id separator ',') 
    from pupil_group_teachers join pupil_groups on pupil_group_teachers.pupil_group_id = pupil_groups.id
    join pupil_group_members on pupil_group_members.pupil_group_id = pupil_groups.id
    group by pupil_group_teachers.teacher_id;