我有一个存储数据包信息的表。数据包可以是项目或其他数据包(可以只包含项目)。 所以,最多,项目是' 2'水平下降。
我需要找出这些物品及其各自的主要物品。分组。
例如,
这是表格
| Packet | Item |
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 2 | 5 |
我试图列出这些项目及其父项(如果它们不包含在任何数据包本身或包含它们的数据包所在的数据包中)
也就是说,对于此测试数据,结果集应为
| Packet | Item |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
我正在使用的查询是
select a.packet, b.item from test a, test b where a.item = b.packet
union
select packet, item from test where packet not in (select item from test) and item not in (select packet from test);
它有效,但是有更好的方法吗? 这是这种情况的小提琴: http://sqlfiddle.com/#!4/fbf65/1 谢谢!
答案 0 :(得分:4)
它解释了如何构建层次结构以及如何查询它。存储它有两种不同的方式,两者都有利有弊。
第一种方法更简单但不会扩展。 第二种方法需要2个额外的列和复杂的查询,但要使其更具可扩展性。
答案 1 :(得分:1)
如果我理解你的意思,请尝试
SELECT t1.packet AS packet,
IFNULL(t2.item, t1.item) AS item,
t2.item
FROM test t1
LEFT JOIN test t2 ON t1.item = t2.packet
HAVING t2.item IS NULL
它有效,但它很乱。请参阅@ A.D。关于设计更好的评论!