2

我有一个boxesbox_size列的表。我想获取总大小为 16 的行。
我应该怎么做?

例如:

  • 获取 16 行box_size = 1
  • 或两排box_size = 4和四排box_size = 2
  • ETC

编辑:

我现在有这个选择查询:

select * from `boxes` order by `boxes`.`box_size` DESC, `date` DESC

因此,如果我们只有行 with box_size = 1I would needLIMIT 0, 16并且如果我有所有行box_size = 4I would need LIMIT 0, 4

但是每一行都有它自己的 box_size 所以我不能有一个特定的限制数,它应该相对于获取的 box_size 值计算。

4

3 回答 3

1

如果您需要从最小到最大的盒子中挑选数据,那么这将帮助您:

SELECT * FROM (
  SELECT *, @sum:=@sum + box_size total_size FROM boxes
  JOIN ( SELECT @sum := 0 ) xa
  ORDER BY box_size
) t
WHERE total_size <= 16;

嵌套查询会从小到大遍历所有的盒子,并且存储box_size当前盒子的总和为box_size之前所有盒子的总和,然后主查询将返回总和小于或等于的所有盒子至 16 岁;

如果你需要从最大到最小的盒子,你可以使用这样的查询:

SELECT * FROM (
  SELECT
     *,
     @potential_total := @sum + box_size,
     @potential_total <= 16 as is_valid,
     @sum := IF( @potential_total <= 16, @potential_total, @sum) total_size
  FROM boxes
  JOIN ( SELECT @sum := 0 ) xa
  ORDER BY box_size DESC
) t
WHERE total_size <= 16 and is_valid = true;

我刚刚测试了上面的例子,它就像一个魅力!

于 2013-09-27T19:00:12.573 回答
0

不是 100% 确定这是否是您要查找的内容,但您可以执行以下查询:

 SELECT * FROM `boxes` WHERE `box_size` = 1 LIMIT 16; #returns 16 boxes of box_size 1
 SELECT * FROM `boxes` WHERE `box_size` = 4 LIMIT 2; #returns 2 boxes of box_size 4
 SELECT * FROM `boxes` WHERE `box_size` = 2 LIMIT 4; #returns 4 boxes of box_size 2
于 2013-09-27T17:52:13.703 回答
0

您可以在 where 子句中放置一个运行总面积来解决这个问题,

SET @size_sum:=0;
SELECT @size_sum:=(@size_sum + POW(box_size,2)) as size_sum, box_size 
FROM table WHERE @size_sum <= 16;

注意:POW函数用于计算盒子的面积

于 2013-09-27T19:18:13.357 回答