假设现在有这两个表:
1.订单表:t_order
order_id |
title |
creat_time |
1 |
张三的订单 |
2024-01-01 |
2 |
李四的订单 |
2024-03-01 |
2.订单明细表:t_order_detail
order_id |
item_type_id |
item_type |
item_name |
1 |
01 |
电子产品 |
电脑 |
1 |
01 |
电子产品 |
手机 |
1 |
02 |
办公用品 |
记事本 |
2 |
01 |
电子产品 |
鼠标 |
2 |
02 |
办公用品 |
鼠标垫 |
比如我要查到既有买 电子产品电脑 也有买 办公用品记事本 的订单 t_order 的记录,也就是:
item_type_id = '01' and item_name = '电脑' 且 item_type_id = '02' and item_name = '记事本'
这样的订单。
我尝试过搜索有推荐使用 group by + having 的方式进行查询的。类似如下的写法:
SELECT o.order_id
FROM t_order o
JOIN t_order_detail od ON o.order_id = od.order_id
GROUP BY o.order_id
HAVING COUNT(CASE WHEN od.item_type_id = '01' AND od.item_name = '电脑' THEN 1 end) > 0
and COUNT(CASE WHEN od.item_type_id = '02' AND od.item_name = '记事本' THEN 1 end) > 0
但是由于我实际的场景下,数据量会比较大,而且涉及的关联表也会比较多,使用 group by 会导致特别特别慢。所以想请教下有没有更好的方法。
|