Извиняюсь, если это очевидно, но я не очень хорош в 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 строк, а нижний возвращает одну строку.
Результаты:
Есть ли способ оптимизировать?
Полная схема находится здесь: https://pastebin.com/FXGLetcV
Я думаю, вам просто нужно 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')
Ниже будет запрос.
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 с нулевым значением, а во втором выборе будет объединение с redeemed_order_num, использовать функцию coalesce или IFNULL для замены нулевого значения в условии соединения