如何从子查询的外部查询中执行多个连接和访问表

时间:2015-09-30 00:21:48

标签: mysql join subquery

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表中有条目的第一个父母(最低索引))

如果我遗漏任何信息,请告诉我。

P.S。在上面的查询中,我得到一个错误,说i.itemnumber未知列我猜是因为我试图从外部查询访问表。

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_TYPE已

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是行号no:3中的父项,但行号no:12中的子项(但不一定是)

  1. 所有孩子或父母可能没有item_types中的条目 例如item99在第二个表中没有条目(它的父母也是孩子)

  2. 现在,表3保持了关系的深度,例如:看看记录no.1 item001是item99的直接子项,所以索引0 但是item560的间接子,所以索引1以及item1234的间接子作为item560是item1234的子,所以第3记录有索引2 对于所有的孩子和父母来说等等。即使作为项目父项的item560也有父母,所以它也会在表格中有一个条目

  3. 好了,现在我想通过查看每个项目来查询属于“玩具”的所有项目,但是item001没有条目 第二个表现在将选择其父类别。但是我们在第三个表中遇到的第一个父母我们必须停在那里(最低指数)

    因为你可以看到第二个表中的最后一个记录有item1234,它有类别'Gels'。 item1234是item560的父级但仍然有 不同的项目类型因此对于item99,我们必须停在最低的索引,即我们找到并继续前进的item560直接父级。

    所以这里是序列,对于item001,我们没有在表2中找到一个条目,所以我们选择第一个父项,即item99,它也没有条目 表2所以我们移动了第三个父级并找到了表2中的记录,所以我们停在那里

    另一个例子:对于item005,表2中没有条目,所以我们在索引0处移动到父item006,我们在表2中找到条目,所以我们在这里停止

1 个答案:

答案 0 :(得分:1)

如果我理解你,就像这样。但我还没试过呢

select in.itemnumber, in.quantity
join item_types it on it.itemnumber=in.itemnumber
where it.type = "Toys"
union
select in.itemnumber, in.quantity
join item_index_info io on io.child=in.itemnumber
join item_types it on it.itemnumber=io.oparent
where it.type = "Toys"

我建议让查询的每个部分都有效,然后使用 union