选择添加到数字的记录

时间:2014-02-20 11:51:43

标签: mysql select sum

我有一张看起来像这样的桌子 表 - mylist

-----
id | max_p 
----------
1   | 4  
2   | 2   
3   | 2   
4   | 6  
5   | 2    
6   | 2

我想运行一个查询,该查询将找到max_p = 10之和的最小行数。所以在这种情况下,它会选择记录1和4

如果我想运行相同的查询来查找12,那么它将选择记录1,4和5

如果我想找到等于2的记录,它只选择记录号5,因为这是正确的数字,因此不需要选择一条记录?

理想情况下,如果所需数量与任何一行相同,则只选择一条记录,如果这不可能,则会选择两条记录,然后选择三条等。如果所需的数字不是&n;可能然后它会返回一个空结果

在这里摆弄:http://ideone.com/3ECaT2

CREATE TABLE  `my_list` (
  `id` int(2) ,
  `max_p` int(2),
  PRIMARY KEY (`id`)
) ;


INSERT INTO `my_list` (`id`, `max_p`) VALUES
(1, 4),
(2, 2),
(3, 2),
(4, 6),
(5, 2),
(6, 2);

任何帮助非常感谢

1 个答案:

答案 0 :(得分:2)

要在SQL中真正解决此问题,您需要递归子查询。 MySQL不提供此功能。您可以做的是寻找具有最多给定数量元素的这种组合。以下查询针对四种组合实现此目的:

select ml1.max_p as p1, ml2.max_p as p2, ml3.max_p as p3, ml4.max_p as p4
from my_list ml1 left outer join
     my_list ml2
     on ml1.id < ml2.id left outer join
     my_list ml3
     on ml2.id < ml3.id left outer join
     my_list ml4
     on ml3.id < ml4.id
where coalesce(ml1.max_p, 0) + coalesce(ml2.max_p, 0) + coalesce(ml3.max_p, 0) + coalesce(ml4.max_p, 0)

要获得最短的数量,请计算元素数量并使用limit

select ml1.max_p as p1, ml2.max_p as p2, ml3.max_p as p3, ml4.max_p as p4
from my_list ml1 left outer join
     my_list ml2
     on ml1.id < ml2.id left outer join
     my_list ml3
     on ml2.id < ml3.id left outer join
     my_list ml4
     on ml3.id < ml4.id
where coalesce(ml1.max_p, 0) + coalesce(ml2.max_p, 0) + coalesce(ml3.max_p, 0) + coalesce(ml4.max_p, 0)
order by ((ml1.map_p is null) +
          (ml2.map_p is null) +
          (ml3.map_p is null) +
          (ml4.map_p is null)
         ) desc
limit 1;