2014-10-04 23 views
0

我有點堅持這一...SQL相關的行

我有一個項目表:

id | name 
1 | item 1 
2 | item 2 
3 | item 3 
4 | item 4 

和相關項目表:

id | item_id | related_item_id 
2 |  1 | 2 
3 |  1 | 4 

所以這意味着第1項與第2項和第4項有關。 現在我試圖在相關項目總是跟隨它們的主要項目的列表中顯示這些項目:

item 1 
item 2 
item 4 
item 3 

然後我就可以直觀地顯示,這些項目2和4都涉及到項目之一,並得出這樣的:

item 1 
-- item 2 
-- item 4 
item 3 

說實話,還沒有得到任何想法我自己。我猜我可以查詢與任何其他項目無關的項目,並獲取「父項目」列表,然後在腳本循環中單獨查詢關係。這不是絕對最性感的解決方案...

+0

我們可以假設一件物品只與另一件物品有關嗎? (也就是說,結果列表中沒有任何重複的項目。)因此,允許(1,2)和(1,4),但不允許(2,1)和(4,1)。 – 2014-10-04 17:03:46

+0

你正在使用哪些DBMS? Postgres的?甲骨文? – 2014-10-04 17:09:15

+0

是的,結果列表沒有任何重複的項目。我正在使用MySQL。 – 2014-10-04 17:27:54

回答

1

我假設這個問題是關於訂購物品清單,沒有重複。也就是說,一個給定的項目沒有一個以上的家長(我在評論中要求)。

如果是這樣,你可以用left outer joinorder by中的巧妙做到這一點。

select coalesce(r.related_item_id, i.id) as item_id 
from items i left join 
    related r 
    on i.id = r.related_item_id 
order by coalesce(r.item_id, i.id), 
     (r.related_item_id is null) desc; 

left outer join標識父母,因爲他們沒有任何匹配的行。如果是這樣,coalesce()找到它們並使用物品ID。

+0

謝謝,但它似乎並沒有爲我做伎倆......它確實以相關項目(子項目)跟隨父項目的方式排列列表;但是,這些相關的子項並不總是彼此相鄰。在這些相關的子項之間可能存在另一項,因爲它的ID大於第一父項ID並小於最後一個子項ID。我希望這是有道理的。 – 2014-10-04 17:30:56

0

在我看來,而不是在查詢中實現這個邏輯,你應該把它移動到你的實際代碼。 假設item_ids是連續的,您可以找到最大數量的item_id,然後在循環 中,您可以找到related_item_id到每個item_id並從中創建一個方便的數據結構。

0

此功能屬於分層查詢類別。在Oracle中,它由連接子句處理不確定有關mysql。但是你可以搜索「分層查詢mysql」來得到答案。