如何选择包含某些SKU的订单

时间:2019-08-21 18:21:08

标签: mysql sql

我需要找到包含以AB开头的SKU的商品,但仍然希望查询返回包含AB和其他商品的订单。

order number 12334: sku AB12 & AB24
order number 22356: sku AB523 & KC5145              
order number 123556: sku CD5641 & BG521

我希望查询返回订单号12334和22356,而不是123556

我还想知道订单是纯AB还是带有其他商品的AB 因此该表将返回仅包含AB的订单计数和包含AB与其他项目的订单计数。

我有两个表:orders表和line_items

orders表使order_id链接到line_items表ID

select * from xx.line_items l
left join xx.orders o on l.order_id=o.id
where sku like 'AB%'

2 个答案:

答案 0 :(得分:0)

您没有为我们提供完整的解决方案的表和列的太多细节,但是看看您是否可以从这个模型中构建一些东西

select 
sku,
(char_length(sku)-char_length(replace(sku,'AB','')))/2 as item_count 
from your_table 
where sku like '%AB%';

答案 1 :(得分:0)

以下查询为您提供了所有带有AB项目的订单ID。它显示了它们的AB计数和它们的总数,因此您可以比较两者。您还可以添加CASE WHEN表达式来计算一个标志,以显示订单是否为纯AB。

所有这些都简单地将每个订单的项目分组,计算AB项目并关闭所有没有AB项目的订单。

select
  order_id,
  count(*) as count_all,
  count(case when sku like 'AB%' then 1 end) as count_ab
from line_items
group by order_id
having count(case when sku like 'AB%' then 1 end) > 0;

您可以在MySQL中用count(case when sku like 'AB%' then 1 end)替换sum(sku like 'AB%')

以下是建立在上面的查询,用于计算纯AB订单和混合订单:

select (count_all = count_ab) as ab_only, count(*)
from
(
  select count(*) as count_all, count(case when sku like 'AB%' then 1 end) as count_ab
  from line_items
  group by order_id
  having count(case when sku like 'AB%' then 1 end) > 0
) counted
group by (count_all = count_ab);