簡體   English   中英

選擇總和大於一定數量的最小數量的記錄

[英]selecting the minimum amount records where the sum is greater than a certain number

我正在嘗試為餐廳預訂系統匯總一個查詢。 這樣的想法是,如果沒有足夠大的桌子來容納聚會的人數,那么可以瀏覽其他空閑桌子,找到兩個足夠大的桌子,可以放在一起以容納聚會的人數。

理想情況下,我希望能夠選擇最少的桌子以與聚會的規模盡可能地匹配。

例如,如果有一個要求有十二個表的請求,那么我想理想地找到六個表中的兩個,並且不再有。

這是我嘗試過的查詢,但給出的結果為空

select tbl_id, sum(max_seats) as sumseats from tbl_list 
group by tbl_id having sumseats> 11

我已經鏈接到sql小提琴以顯示表結構

http://sqlfiddle.com/#!2/5a6904/2/0

嘗試以下類似的方法(除了MySQL外,您還需要類似PHP的方法):

  1. 檢查一張桌子是否可以容納所需人數。 如果是,請按容量升序打印所有此類表格。
  2. 如果沒有一個表的容量大於或等於所需容量,請保留容量最大的表,並從所需容量中減去容量。
  3. 轉到步驟1。

代碼:

$bookedTables = array();
while ($requiredCapacity > 0) {
    $query = "SELECT * FROM (SELECT tbl_id, max_seats FROM tbl_list WHERE max_seats > $requiredCapacity)table1 ORDER BY table1.max_seats ASC";
    $result = mysql_query($query);
    if (count($result)!=0) {
        array_push($bookedTables, $result[0]['tbl_id'];
        $requiredCapacity = $requiredCapacity - $result[0]['max_seats'];
    }
    else {
        $query = "SELECT * FROM (SELECT tbl_id, max_seats FROM tbl_list)table1 ORDER BY table1.max_seats DESC";
        if (count($result)!=0) {
            array_push($bookedTables, $result[0]['tbl_id'];
            $requiredCapacity = $requiredCapacity - $result[0]['max_seats'];
        }
        else {
            echo "No more tables left";
            break;
        }
    }
}

我並沒有提議將其作為一個明確的答案,但需要考慮一下...

SELECT * FROM tables;
+----+------+
| id | size |
+----+------+
|  1 |    2 |
|  2 |    2 |
|  3 |    2 |
|  4 |    2 |
|  5 |    4 |
|  6 |    4 |
|  7 |    4 |
|  8 |    6 |
|  9 |    6 |
| 10 |    8 |
+----+------+

 SELECT *
     , x.size + y.size + z.size pax 
  FROM tables x 
  LEFT 
  JOIN (SELECT * FROM tables UNION SELECT 0,0) y 
    ON y.size < x.size OR (y.size = x.size AND y.id < x.id) 
  LEFT 
  JOIN (SELECT * FROM tables UNION SELECT -1,0) z 
    ON z.size < y.size OR (z.size = y.size AND z.id < y.id)
HAVING pax >= 12 
 ORDER 
    BY pax
     , x.size DESC
     , y.size DESC
     , z.size DESC
 LIMIT 1;
+----+------+------+------+------+------+------+
| id | size | id   | size | id   | size | pax  |
+----+------+------+------+------+------+------+
| 10 |    8 |    7 |    4 |   -1 |    0 |   12 |
+----+------+------+------+------+------+------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM