2012-10-02 135 views
3

比方說,我想找出所有父母和我父母在同一班級的孩子。我可以寫這樣的查詢:SQL:查找父母都是我的所有孩子

SELECT child.* FROM child 
JOIN parent ON child.ParentID = parent.ID 
    WHERE parent.class IN (SELECT parent1.class 
    FROM parent1 JOIN child1 
     ON parent1.id = child1.parentID 
    WHERE child1.ID = MyID) 

不知怎的,這感覺就像我做錯了,我在寫(約)相同的連接兩次,但我不能想出一個辦法來提高它(我可以找出嵌套子查詢的其他方法,但沒有一個看起來更整潔)。

有沒有一個乾淨的方式做到這一點,我失蹤了?或者我做對了嗎?

編輯:正如GolzeTrol在他對這個問題的(完整)回答中所指出的,兒童被限制爲只有一個父母是很奇怪的。他是完全正確的,我並不打算在實際的家庭中運行這個查詢,而是在其他一些表格上,每個孩子實際上只與一個父母關聯。

回答

2

只要加入他們。你必須加入兩個表格兩次,以獲得相關的父母,然後他們的孩子,但除此之外,這是一個簡單的內部聯接。我添加了別名(在這種情況下您必須使用它)以明確每個表的「角色」。

select 
    otherkids.* 
from 
    child me 
    /* Join below is weird. I got only 1 parent... */ 
    inner join parent myparents on myparents.ID = me.ParentID 
    inner join parent otherparents on otherparents.class = myparents.class 
    inner join child otherkids on otherkids.ParentID = otherparents.ID 
where 
    me.ID = :MyID and 
    otherkids.ID <> me.ID /* Exclude myself */ 

我必須說,我認爲這是奇怪的,一個孩子有一個PARENTID,而我認爲一個孩子有一個母親和一個父親,或至少兩個的父母。

家譜計劃通常會把孩子放在家庭中。所以一個家庭有配偶和孩子。這樣,即使你不認識父母(或只知道一個),也可以連接孩子,如果他們離婚並重新結婚,你可以輕鬆地將人們與多個家庭聯繫起來。也可能是你的表結構的建議。

+0

謝謝,那正是我想要的。只是沒有想到自己加入一張桌子。關於結構,你是對的 - 我實際上並沒有爲兒童和父母這樣做,但對於我的數據庫中的一些兒童只有一位家長的表 - 我會在問題中留下一個註釋。 –

-1

或許這能夠解決您的問題

SELECT孩子。* FROM孩子INNER JOIN父ON child.ParentID = parent.ID INNER JOIN parent2 ON parent.class = parent2.class INNER JOIN的child2 ON child2.ParentID = parent.ID WHERE child.ID =本身份識別碼和child2.ID <>身份識別碼

確定試試這個呢:)

2

我@ GolezTrol的解決方案達成一致,但你仍然可以解決你的方式。爲了使查詢能夠像你寫的那樣工作,你應該添加一個外部的WHERE子句,不包括你自己返回的子元素(按照@GolezTroi解決方案)。

此外,雖然它不會影響執行,但使用'='而不是'IN'樣式子查詢的語義更準確,因爲您只希望子查詢返回一條記錄(即你的父母在一個類):

SELECT child.* FROM child 
JOIN parent ON child.ParentID = parent.ID 
    WHERE parent.class = (SELECT parent1.class 
    FROM parent1 JOIN child1 
     ON parent1.id = child1.parentID 
    WHERE child1.ID = MyID) 
    AND child.ID != MYID 

當然還是有,你正在使用相關子查詢的問題(即你所加入的子查詢到外部查詢),並且這些往往比其他方法處理時間更長。至於你關於兩次執行同​​一個連接的觀點,SQL通常會迫使你在更復雜的查詢中執行此操作,尤其是那些將記錄與同一個表中的其他記錄相關聯的查詢。

+0

用'='vs'in'進行智能思考。在這種情況下,子查詢的確應該返回1條記錄,而MySQL在'in'中特別慢。對於這個問題,我選擇了「簡單連接」。 ;-) – GolezTrol

相關問題