单表父子关系查询

gr8qqesn  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(379)

我编写了一个查询,从没有任何子项的表中获取项。工作正常,但速度很慢。有没有更好的/更简单的/优化的方法来写同样的东西?

select distinct id, (select count(i.item_id) from order_item as i where i.parent_item_id = o.item_id) as c
from order_item as o
where product_type = 'bundle'
having c = 0
order by id desc
limit 10;

这些领域中很少有人能得到结构的概念

Table: order_item
Columns:
item_id PK
order_id
parent_item_id
product_id
product_type

item_id  | order_id | parent_item_id | product_id | product_type
-----------------------------------------------------------------
   1     |    1     |     null       |     1      |   bundle
   2     |    1     |       1        |     2      |   simple
   3     |    1     |       1        |     3      |   simple
   4     |    1     |     null       |     4      |   bundle
   5     |    2     |     null       |     1      |   bundle
   6     |    2     |       5        |     2      |   simple
   7     |    2     |       5        |     3      |   simple

查询只应返回第4项

yjghlzjz

yjghlzjz1#

试试下面。还要考虑在上创建索引 PARENT_ITEM_ID 以及 ITEM_ID ```
SELECT OI.*
FROM ORDER_ITEM OI
LEFT JOIN ORDER_ITEM OI2
ON OI2.PARENT_ITEM_ID = OI.ITEM_ID
WHERE OI.PRODUCT_TYPE = 'bundle' AND OI2.PARENT_ITEM_ID IS NULL

8oomwypt

8oomwypt2#

我建议 not exists :

select oi.*
from order_item oi
where oi.product_type = 'bundle' and
      not exists (select 1
                  from order_item oi2
                  where oi2.parent_item_id = oi.item_id and oi2.product_type = 'bundle'
                 )
order by id desc
limit 10;

为了提高性能,您需要一个索引 order_item(parent_item_id, product_type) .
注意:我不确定您是否想要 product_type 子查询中的筛选器,但它是您的查询所使用的逻辑。

相关问题