2014-10-04 44 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”来得到答案。