MySQL仅在满足一次条件时加入

MySQL仅在满足一次条件时加入,mysql,left-join,multiple-tables,Mysql,Left Join,Multiple Tables,也许有一个简单的解决办法,但我不能完全相信 假设我们有4张桌子 人员(身份证,是教师) 人员关系(id、人员id、教师id) 房间关系(id、人员id、房间id) 房间(id)(此处未使用) 人可以是教师也可以是学生。 如果一个人是教师,他们可以通过人际关系分配多个学生。 一个人可以直接或通过他们的老师被分配到多个房间(所以person->room或person(no-teacher)->person(teacher)->room) 我想找到没有分配到任何房间的人,既不是直接分配的,也不是通过分

也许有一个简单的解决办法,但我不能完全相信

假设我们有4张桌子 人员(身份证,是教师) 人员关系(id、人员id、教师id) 房间关系(id、人员id、房间id) 房间(id)(此处未使用)

人可以是教师也可以是学生。 如果一个人是教师,他们可以通过人际关系分配多个学生。 一个人可以直接或通过他们的老师被分配到多个房间(所以person->room或person(no-teacher)->person(teacher)->room)

我想找到没有分配到任何房间的人,既不是直接分配的,也不是通过分配房间的老师分配的。但我的查询也会返回分配给教师的人员,其中有些人有房间,有些人没有。因此,如果其中一位老师有指定的房间,我不希望学生回到这里

SELECT * FROM persons p
LEFT JOIN rooms_relation r ON r.person_id = p.id
LEFT JOIN persons_relation pr ON pr.person_id = p.id
LEFT JOIN rooms_relation tr ON tr.person_id = pr.teacher_id
WHERE tr.id IS NULL AND r.id IS NULL;
例如:

  • 第一个人是学生
  • 7、8、9人是教师
  • 学生分配给教师7、8和9(通过人际关系)
  • 学生没有指定房间
  • 教师7和9有分配给他们的房间(通过房间关系)
  • 8老师没有指定房间(这就是问题所在)
由于该学生至少有一个房间是通过7号和9号教师分配的,所以不应归还该学生。 但由于教师8没有指定房间,所以有一行tr.id为NULL,因此他返回。我不想那样


(我知道我可能只使用了一个房间联接,但我)

我想查找未分配到任何房间的人员

以下查询将列出不在
rooms\u relation
表中的人员。这不是你想要的吗

 SELECT 
        * 
    FROM 
        `persons` 
    WHERE 
        `id` NOT IN (
            SELECT 
                DISTINCT(person_id) 
            FROM 
                `rooms_relation`
        )
我想我解决了。 由于一个人行的数量大于1,如果有任何关系,我必须添加这个条件

SELECT * FROM persons p
LEFT JOIN rooms_relation r ON r.person_id = p.id
LEFT JOIN persons_relation pr ON pr.person_id = p.id
LEFT JOIN rooms_relation tr ON tr.person_id = pr.teacher_id
WHERE tr.id IS NULL AND r.id IS NULL 
GROUP BY p.id
HAVING count(p.id) = 1;

你必须合计一名学生,并计算房间数量。如果为正,则不应返回该行。