列表中与SQL组相关的行

时间:2014-10-04 17:01:38

标签: 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

说实话,我自己也没有任何想法。我可以查询与任何其他项无关的项,并获取“父项”列表,然后在脚本循环中单独查询关系。这绝不是最性感的解决方案......

3 个答案:

答案 0 :(得分:1)

我假设这个问题是关于订购商品列表,没有重复。也就是说,给定项目没有多个父项(我在评论中提出)。

如果是这样,您可以使用left outer join中的order 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。

答案 1 :(得分:0)

在我看来,不应在查询中实现此逻辑,而应将其移至实际代码中。 假设item_ids是顺序的,您可以找到最大数量的item_id,然后循环 你可以找到每个item_id的related_item_id,并从中创建一个方便的数据结构。

答案 2 :(得分:0)

此功能属于分层查询类别。在Oracle中,它由connect by子句处理,不确定mysql。但是你可以搜索“层次查询mysql”来得到答案。