2016-09-08 44 views
0

我有兩個表:段(id,name)和部分(id,name)。這兩個關係具有n:m關係,因此段可以有多個部分,一個部分可以屬於多個段。MySQL n:m從表1中找到只包含表2中元素的元素

當然,我們有一個鏈接表segments_parts(segments_id,parts_id)將這兩者連接在一起,就像習慣用n:m關係一樣。

現在,給出一個零件ID列表,我想檢查是否有一個段具有這些部分,但沒有更多!

因此,例如,如果段2具有部分1和3,並且段5具有段1,3和7,當我請求「給出段1和段3」時,我只希望返回段2,而不是兩個都。

Segments       Parts 
------------------------   ------------------------ 
| ID | Name   |   | ID | Name   | 
------------------------   ------------------------ 
| 1 | Segment 1  |   | 1 | Part 1   | 
| 2 | Segment 2  |   | 2 | Part 2   | 
| 3 | Segment 3  |   | 3 | Part 3   | 
| 4 | Segment 4  |   | 4 | Part 4   | 
| 5 | Segment 5  |   | 5 | Part 5   | 
------------------------   | 6 | Part 6   | 
           | 7 | Part 7   | 
           ------------------------ 

segments_parts 
------------------------ 
| segment_id | part_id | 
------------------------ 
|  1  |  1 | 
|  1  |  4 | 
|  2  |  1 | 
|  2  |  3 | 
|  3  |  2 | 
|  3  |  4 | 
|  4  |  2 | 
|  4  |  3 | 
|  5  |  1 | 
|  5  |  3 | 
|  5  |  7 | 
------------------------ 

給定輸入1,3我想段ID 2回(因爲它是具有這兩個部分ID的段,而不是其他。需要注意的是段5也有部分1和3,但也有一部分7,因此不應該返回!)

給定輸入1,3,7我想段ID 5返回。

給定輸入1,6我不想返回任何東西,因爲沒有包含這兩部分的段。

+0

添加樣品表數據和預期結果。格式化好! – jarlh

回答

1

這是一個集內查詢。我喜歡用group byhaving解決這些問題。假設沒有重複:

select sp.segment_id 
from segments_parts sp 
group by sp.segment_id 
having <list size> = sum(sp.parts_id in (<your list here>)) and 
     <list size> = count(*); 

如果你能有重複,則:

select sp.segment_id 
from segments_parts sp 
group by sp.segment_id 
having <list size> = count(distinct case when parts_id in (<your list here> then parts_id end) and 
     <list size> = count(distinct parts_id); 

您需要添加列表的長度having子句。

+0

哇,完美...只要網站允許,我會給你正確的答案。 :) – Sorcy

+0

啊,我說的太快了......顯然它不像我期望的那樣工作。我實際上將不得不按照jarl的要求添加一些示例數據,以使我的案例更清晰。敬請關注。 – Sorcy

+0

@Sorcy。 。 。我試圖使用一個快捷方式。你可以通過放入列表的長度來修正'having'子句。 –

相關問題