也许有一个简单的解决办法,但我不能把它当回事。
假设我们有4张桌子--人(id,is_teacher) persons_relation (id,person_id,teacher_id) rooms_relation (id,person_id,room_id)房间(id) (不在这里使用)
人可以是教师,也可以是学生。如果一个人是教师,他们可以通过persons_relation分配多个学生。一个人可以被分配到许多房间,直接或通过他们的老师(所以人->房间或人(没有老师)->person(教师)->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;示例:
student
)
由于学生至少有一个房间通过教师7和9分配给他,他不应该被退回。但是由于老师8没有指定空间,所以有一行tr.id是空的,所以他会被返回。我不想这样。
(我知道在房间里我只需要一次连接,但我)
发布于 2021-06-08 18:32:17
I want to find the persons that ARE NOT assigned to ANY room
下面的查询将列出不在rooms_relation表中的人员。不是你想要的吗?
SELECT
*
FROM
`persons`
WHERE
`id` NOT IN (
SELECT
DISTINCT(person_id)
FROM
`rooms_relation`
)发布于 2021-06-08 22:28:24
我想我解决了。由于一人行的数目大于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;https://stackoverflow.com/questions/67892439
复制相似问题