【发布时间】:2015-09-30 00:21:47
【问题描述】:
select * from items as i join item_types it on it.itemnumber = (
select itemnumber from item_types as it2 join item_index_info as iii on it2.itemnumber=iii.parent and it2.`type` ='ELECTRONICS' AND it2.`value`='TELEVISIONS'
AND iii.child=i.itemnumber order by iii.`index` limit 1);
所以表格具有以下结构:
1.items 有列:
itemnumber, availability, quantity, parent
2.item_types 有列:
id, itemnumber, type, value
3.item_index_info 有列:
parent, child, index(在此表中,父项也可以是另一个项的子项)
使用上面的查询,我想获取某个类型的所有项目,这很容易找到,但棘手的部分是 item_type 可能不与每个项目相关联,并且 每个孩子有时可以说孩子可能在 item_index_column 中没有任何条目,但它的父母可能(这就是为什么我们有第二个查询但我们必须将其限制为 1 因为不幸的是,孩子可能有多个级别的父母,即索引,所以我们必须找到第一个在 item_types 表中有条目的父母(最低索引)
如果我遗漏任何信息,请告诉我。
附:在上面的查询中,我收到一条错误消息,说 i.itemnumber Unknown Column 我猜是因为我试图从外部查询访问表。
项目
itemnumber availibility quantity parent
item001 y 10 item99
item002 y 10 item65
item003 y 10 item012
item004 y 10 item67
item005 y 10 item006
item006 y 10 item43
item007 y 10 item87
item008 y 10 item57
item009 y 10 item89
item010 y 10 item33
item011 y 10 item68
item012 y 10 item34
item99 y 10 item560
item560 y 10 item1234
item_types
id itemnumber type value
1 item011 Electronics xyz1
2 item56 A xyz2
3 item012 B xyz3
4 item67 C xyz4
5 item006 D xyz5
6 item87 E xyz6
7 item57 F xyz7
8 item89 G xyz8
9 item33 H xyz9
10 item68 I xyz010
11 item34 J xyz011
12 item560 Toys xyz012
13 item1234 Gels xyz013
item_index_info
parent child index
item99 item001 0
item560 item001 1
item1234 item001 2
item560 item99 0
item1234 item560 0
item002 item65 0
item003 item012 0
item003 item34 1
item012 item34 0
item004 item67 0
item006 item005 0
需要注意的几点: 1.第一个表的父母也是同一个表的孩子: 例如item012 是第 3 行的父项,但第 12 行的子项(但不一定)
所有孩子或父母可能在 item_types 中没有条目 例如item99 在第二个表中没有条目(它也是一个父项和一个子项)
现在表 3 维护了关系的深度,例如查看第 1 号记录 item001 是 item99 的直接子项,因此索引为 0 但它是 item560 的间接子代,所以索引 1 也是 item1234 的间接子代,因为 item560 是 item1234 的子代,所以第三条记录的索引为 2 等等所有的孩子和父母..即使是项目的父母的 item560 也有父母,所以它也会在表格中有一个条目
好的,现在我想通过遍历每个项目来查询属于“玩具”的所有项目,但 item001 在 第二个表,因此现在将选择其父类别。但是我们在第三个表中遇到的第一个父级我们必须停在那里(最低索引)
因为您可以看到第二个表中的最后一条记录有 item1234 类别为“凝胶”。 item1234 是 item560 的父级,但仍有 不同的项目类型,因此对于 item99,我们必须在最低索引处停止,即我们找到的 item560 直接父级并继续前进。
所以这里是序列,对于 item001,我们在表 2 中没有找到条目,所以我们选择第一个父项,即 item99,它在表 2 中也没有条目 表 2,所以我们移动到第三个父级并在表 2 中找到了记录,所以我们停在那里
另一个例子:对于 item005,表 2 中没有条目,所以我们移动到索引 0 处的父 item006,我们在表 2 中找到了条目,所以我们停在这里
【问题讨论】:
-
使用示例数据和所需结果编辑您的问题。解释很难理解。
-
@GordonLinoff 好的,给我几分钟..