【问题标题】:How to do multiple joins and access table from outer query from subquery如何从子查询的外部查询执行多个连接和访问表
【发布时间】: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 行的子项(但不一定)

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

  2. 现在表 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 好的,给我几分钟..

标签: mysql join subquery


【解决方案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

【讨论】:

  • 我相信这可行。让我试一试。不过非常感谢您的回答。
  • 您的查询将失败此条件:“因为您可以看到第二个表中的最后一条记录有 item1234,其类别为 'Gels'。item1234 是 item560 的父项,但仍有不同的项目类型,因此item99 我们必须停在最低索引处,即我们找到的 item560 直接父级并继续前进。”
  • @john.p.doe,那么你必须使用存储过程。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多