Оптимизировать сложный SQL-запрос - PullRequest
0 голосов
/ 01 февраля 2019

Извиняюсь, если это очевидно, но я не очень хорош в SQL.У меня есть несколько таблиц, которые все должны быть объединены, но один из столбцов может быть нулевым.

У меня есть этот запрос:

select orders.ordnum, orders.tstamp, orders.sku, code, redeemed_order_num, null as redeemed_date, null as fullname
from customer_subscriptions orders
join bulk_codes codes
    on codes.bulk_order_id = orders.subscription_id
where (orders.sku="bulk-box" or orders.sku="bulk-book") and redeemed_order_num is null
union
select orders.ordnum, orders.tstamp, orders.sku, code, redeemed_order_num, redeemed_orders.date redeemed_date, customers.fullname
from customer_subscriptions orders
join bulk_codes codes
    on codes.bulk_order_id = orders.subscription_id
join customer_subscriptions redeemed_orders
    on codes.redeemed_order_num = redeemed_orders.ordnum
join customers
    on customers.cid = redeemed_orders.cid
where (orders.sku="bulk-box" or orders.sku="bulk-book")

Верхний выбор возвращает первые 9 строк инижняя возвращает одну строку.

Результаты: Screenshot of results

Есть ли способ оптимизации?

Полная схема здесь: https://pastebin.com/FXGLetcV

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Ниже приведен запрос.

         Select orders.ordnum, orders.tstamp, orders.sku, code, redeemed_order_num, null as redeemed_date, null as fullname
           From customer_subscriptions orders
     Inner join bulk_codes codes 
             On codes.bulk_order_id = orders.subscription_id 
            And redeemed_order_num is null -- comment
Left outer join bulk_codes codes 
             On codes.bulk_order_id = orders.subscription_id
left outer join customer_subscriptions redeemed_orders 
             On COALESCE(codes.redeemed_order_num, 111111) = redeemed_orders.ordnum
left outer join customers 
             On customers.cid = redeemed_orders.cid
          where orders.sku='bulk-box' 
             Or orders.sku='bulk-book'

В заданном вами запросе первый выбор будет объединять только redeemed_order_num со значением NULL, а во втором выборе происходит соединение с redeemed_order_num, используйте функцию coalesce или IFNULL для заменынулевое значение в состоянии соединения

0 голосов
/ 01 февраля 2019

Я думаю, вам просто нужно left join:

SELECT orders.ordnum, orders.tstamp, orders.sku, code,
       redeemed_order_num, redeemed_orders.date redeemed_date, customers.fullname
FROM customer_subscriptions orders JOIN
     bulk_codes codes
     ON codes.bulk_order_id = orders.subscription_id LEFT JOIN
     customer_subscriptions redeemed_orders
     ON codes.redeemed_order_num = redeemed_orders.ordnum LEFT JOIN
     customers
     ON customers.cid = redeemed_orders.cid
WHERE orders.sku IN ('bulk-box', 'bulk-book')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...