假设现在有这两个表:
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 会导致特别特别慢。所以想请教下有没有更好的方法。
1
CapNemo 2 天前
SELECT o.order_id
FROM t_order o JOIN t_order_detail od ON o.order_id = od.order_id and od.item_name = '电脑' JOIN t_order_detail od2 ON o.order_id = od2.order_id and od2.item_name = '记事本' GROUP BY o.order_id |