产品表
## 产品 ID ## | ## 莱恩 ## | ## 宽度 ## | ## 身高 ## |
---|---|---|---|
239 | 350 | 300 | 100 |
240 | 80 | 80 | 150 |
这是一个示例产品表,我已经给了你相关的列。这个实际的表有 60 行这样的信息。
订单商品表
## 订单 ID ## | ## 产品 ID ## | ## 产品_数量## |
---|---|---|
10001 | 237 | 1 |
10002 | 240 | 3 |
10003 | 247 | 4 |
这是一个示例 order_items 表,其中产品数量是针对该特定 order_id 销售的商品数量。
纸箱桌
## 纸箱_id ## | ## 莱恩 ## | ## 宽度 ## | ## 身高 ## |
---|---|---|---|
10 | 600 | 300 | 100 |
20 | 80 | 80 | 150 |
carton_id 10 具有长、宽、高的实际值。
查询是: 编写一个查询来显示 order_id 和可以容纳在 carton id 10 中的最大订单的体积(以体积计)。最终输出预计为 1 行。
我无法做更多的事情,这太令人困惑了。请帮忙
select (c.len*c.width*c.height) as Max_volume
from carton c
where c.carton_id = 10;
如果每个订单中始终只有一种产品(如示例数据所示),则一个选项是加入和过滤。
select o.order_id, p.len * p.width * p.height volume
from order_items o
inner join products p on p.product_id = o.product_id
inner join cartons c on c.len >= p.len and c.width >= p.width and c.height >= p.height
where c.carton_id = 10
order by volume desc limit 1
查询过滤符合纸箱 10 的产品订单(即产品的三个尺寸均小于纸箱的尺寸),然后按体积降序排序,仅保留第一行。
SELECT
OI.ORDER_ID,
MAX(P.LEN * P.WIDTH * P.HEIGHT) AS BIGGEST_VOLUME
FROM
ORDER_ITEMS OI
JOIN
PRODUCT P ON OI.PRODUCT_ID = P.PRODUCT_ID
JOIN
CARTON C ON P.LEN <= C.LEN AND P.WIDTH <= C.WIDTH AND P.HEIGHT <= C.HEIGHT
WHERE
C.CARTON_ID=10
GROUP BY
OI.ORDER_ID
ORDER BY
BIGGEST_VOLUME DESC
LIMIT 1;
它选择 ORDER_ID 并使用产品尺寸计算每个订单商品的体积,然后找到可放入 Carton ID 10 的订单中的最大体积。 GROUP BY 子句确保单独考虑每个订单,并且 ORDER BY 子句按数量降序对结果进行排序。最后,LIMIT 1确保只返回交易量最大的订单。