簡體   English   中英

MySQL 僅在條件滿足一次時加入

[英]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;

例子:

  • 第 1 個人是學生
  • 7,8,9 人是教師
  • 學生被分配給教師 7、8 和 9(通過 people_relation)
  • 學生沒有分配房間
  • 老師 7 和 9 有分配給他們的房間(通過 rooms_relation)
  • 老師 8 沒有分配房間(這是問題)

由於學生至少有一個由老師 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM