запрос отношения между родителями и дочерними элементами из одной таблицы - PullRequest
0 голосов
/ 13 июля 2020

Я написал запрос на получение элементов из таблицы, у которой нет дочерних элементов. Он работает нормально, но очень медленно. Есть ли лучший / простой / оптимизированный способ написать одно и то же?

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-е товар

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Попробуйте ниже. Также рассмотрите возможность создания индексов для 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
0 голосов
/ 13 июля 2020

Я бы посоветовал 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 фильтр в подзапросе, но это logi c, который использует ваш запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...