2014-02-20 33 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它記錄將只選擇第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