2014-02-20 2 views
1

У меня есть таблица, которая выглядит следующим образом таблицы - 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, так как это правильный номер, и поэтому нужно выбрать не более одной записи?

В идеале это выбрало бы только одну запись, если бы желаемая сумма была такой же, как любая строка, тогда, если бы это было невозможно, она выбрала бы две записи, затем три и т. Д. Если желаемое число не было возможным, вернет пустой результат

скрипку здесь: 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); 

Любая помощь очень ценится

+4

получить весь набор данных, и сделать это на стороне клиента. .. –

ответ

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; 
+1

+1 довольно аккуратный. За исключением форматирования курса :) – Bohemian

+0

Спасибо за ваш ответ Гордон. Когда я пытаюсь запустить любой из запросов, я получаю сообщение об ошибке «Не уникальная таблица/псевдоним:« ml2 »« Извинения за то, что вы такой новичок – user3332419

Смежные вопросы