2014-04-17 32 views
1

說我有2個表,稱爲父母和孩子。父母可以有零至很多孩子,而孩子可以有一對多父母。我如何找到作爲兩個特定孩子的父母的所有父元素。如何構建SQL查詢以查找兩個特定其他對象的父對象?

例如,說我有父母[P_A,P_B,P_C,P_D],和兒童:C_A,C_B] 他們的結構如下:

  • P_A具有C_A作爲一個孩子
  • P_B已C_B作爲一個孩子
  • P_C既有C_A及C_B兒童
  • P_D一直沒有孩子

我如何公式查詢選擇p_c?

如果他們有一個p [id,name]和c具有[id,name]並且[parent_id,child_id]有join_table的結構。 (爲了讓事情變得更容易,我也給了他們連續的id來代替這個例子)。

我試圖解決它想出了下面的SQL

SELECT p.* 
FROM parent AS p 
JOIN join_table AS j ON p.id = j.parent_id 
JOIN children AS c ON j.child_id = c.id 
WHERE c = 1 
    OR c = 2 

但顯然這個選擇P_A和P_B以及P_C。我一直在尋找UNION運營商,但似乎無法得到它的工作。

期待您的答案,謝謝閱讀。 邁克

編輯:提到我使用了您正在尋找在兩個特定的子記錄存在父母的例子

+0

在你的榜樣C_A具有ID = 1,和C_B ID = 2? –

+0

@GrzegorzMotyl對不起,是我使用的約定,只是意識到我沒有指定它們。 –

回答

1

到接受的答案的替代,可能更快:

SELECT p.* 
FROM parent p JOIN join_table j ON p.id=j.parent_id 
WHERE j.child_id=1 OR j.child_id=2 
GROUP BY j.parent_id 
HAVING COUNT(j.child_id)=2; 
+0

感謝你的回答,你已經解決了這個具體的例子,不幸的是我正在尋找一個更通用的方法來使用可變數量的參數。我的錯,我應該更清楚。謝謝你的努力。 (顯然+1爲我給予的情況下優化) –

+0

我認爲這比接受的答案更一般。不在代碼中 - 您仍然需要以類似的方式更改這兩個查詢 - 但效率很高。無論你想要多少個孩子作爲參數,這個查詢總是會產生一個連接和一個線性時間過濾條件。如果額外的孩子可能增加複雜度的順序(n^2,n^3,n^4等等),那麼對於接受的答案,同樣不能(對於數據庫的優化算法沒有深入的瞭解)。 – niklon

+0

當然好,但是當有孩子c_a,c_b和c_c,我們只想c_a和c_b(確切地說)我不認爲這會起作用,就好像有c_a和c_c一樣,仍然會通過查詢(請如我錯了請糾正我)。 (我沒有詳細說明這個要求是我說我犯了一個不夠清楚的錯誤)。 –

3

的ID約定。使用EXISTS該子句:

SELECT * 
FROM parent p 
WHERE EXISTS (select * from join_table j where j.parent_id = p.id and j.child_id = 1) 
    AND EXISTS (select * from join_table j where j.parent_id = p.id and j.child_id = 2); 
+0

正是我所尋找的那種東西,謝謝Thorsten。 –

+0

快速的問題,是否有可能保持連接在外體(如在父母p後)。在輸入這個信息時,我想我意識到你不能這麼做,因爲那樣我的原始查詢仍然會遇到同樣的問題。無論如何要發帖以確認我對它的理解是正確的(並且連接必須是存在的「孩子」) –

+0

當您想要讓孩子與父母一起展示時,您可以加入父表。那麼你將不得不考慮,你實際上想在你的結果列表中看到什麼。一個記錄與p_c和ca和另一個與pc和c_b?或者只是一個記錄p_c和一些關於孩子的聚合(比如說平均年齡或者包含他們名字或者其他字符的字符串)。當您想通過children表中的某些條件找到孩子時,您可以加入exists子句。 –

相關問題