MySQL限制参数相对于行值

时间:2013-09-27 17:47:30

标签: php mysql

我有一个boxes表,其中包含box_size列。 我想获取总大小为16的行。
我该怎么做?

例如:

  • 使用box_size = 1
  • 获取16行
  • 或两行box_size = 4和4行box_size = 2

编辑:

我现在有这个选择查询:

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

所以,如果我们只有box_size = 1行,我需要LIMIT 0, 16,如果我的所有行都有box_size = 4,我需要LIMIT 0, 4

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

3 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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

答案 2 :(得分: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函数用于计算框的区域