[英]MySQL join only when condition is met one time
可能有一個簡單的解決方案,但我無法理解它。
假設我們有 4 個表 people (id, is_teacher) persons_relation (id, person_id, teacher_id) rooms_relation (id, person_id, room_id) rooms (id) (此處未使用)
人可以是老師也可以是學生。 如果一個人是老師,他們可以通過persons_relation分配多個學生。 一個人可以直接或通過他們的老師分配到許多房間(所以人->房間或人(沒有老師)->人(老師)->房間)。
我想找到未分配到任何房間的人,既不是直接分配,也不是通過分配房間的老師。 但我的查詢還返回分配給教師的人,其中有些人有房間,有些人沒有。 因此,如果其中一位老師分配了一個房間,我不希望學生回到這里。
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 和 9 分配的房間,他不應該被退回。 但是由於老師 8 沒有分配房間,所以有一行 tr.id IS NULL 所以他被退回了。 我不想要那個。
(我知道我可以只使用一個加入房間,但我)
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`
)
我想我解決了。 由於如果有任何關系,一個人的行數大於 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.