我有一张看起来像这样的桌子 表 - 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);
任何帮助非常感谢
答案 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;