【问题标题】:MySQL selecting more than one id depending on valueMySQL 根据值选择多个 id
【发布时间】:2017-10-06 17:32:37
【问题描述】:

我正在我的系统中进行库存控制,并且我有一个用于仓库中库存“位置”的表格。这是位置表。

id  location_description_id location_key    product_id  qty
6   1                       1               3           25
7   1                       2               4           25
8   1                       3               3           20

我正在努力获取位置值。例如,如果产品 id 为“3”的订单为 40 件,您可以看到 location_key 1 有 25 件,location_key 3 有 20 件

当第一个用完时,选择下一个可用 location_key 的最佳方法是什么?所以在这种情况下,回报将是 id 6,数量 25 和 id 8,数量 15(总共我的 40)

【问题讨论】:

  • 你能试着更好地解释你的问题吗?
  • @Tomm 基本上,如果我在仓库中有 100 种产品,分为 2 个位置,50 种在“a1”中,50 种在“f1”中,并且有 70 种产品的订单我想退回 a1, 50 和 f1,20 可轻松显示从仓库中的何处挑选产品
  • 希望这可以在 mySQL 中完成
  • 你给脚本或数据库或任何你想要的数据库的数量对吗?
  • @Tomm 是的,我只是想让某人展示一个示例,说明它是如何工作的,然后我可以在其中构建它

标签: php mysql


【解决方案1】:

在 PHP 端做:

$dbLocations = $db->prepare("SELECT * FROM location WHERE product_id = 3")->queryAll();

$totalOrder = 50;
$leftOrder = $totalOrder;
$locations = [];

while ($leftOrder >= 0) {
    $location = array_shift($dbLocations);

    if (!empty($location)) {
       $leftOrder -= $location['qty'];
       $locations[] = $location;
    } else {
       throw new Exception('Quantity is too big for locations');
    }
}

【讨论】:

    【解决方案2】:

    假设您有查询结果以选择存储订购产品的所有位置。您可以在 php 中执行此操作。

    编辑:编辑函数以返回要从每个位置挑选的数量。

    function findLocations($locations, $orderQty)
    {
    $resultLocs = array();
    $i = 0;
    $orderRemainQty = $orderQty;
    
    while ($orderRemainQty != 0) {
        $locQty = $locations[$i]['qty'];
        If ($orderRemainQty > $locQty){
            $locations[$i]['pickUpQty'] = $locQty;
            $orderRemainQty -= $locQty;
        } else {
            $locations[$i]['pickUpQty'] = $orderRemainQty;
            $orderRemainQty = 0;
        }
        $resultLocs[] = $locations[$i];
        $i++;
    }
    return $resultLocs;
    

    }

    【讨论】:

    • 哦,对不起,您不明白您还需要从每个位置提取的确切数量。让我重做功能:)
    • 立即尝试。不像以前那么好看,但它确实有效。
    【解决方案3】:

    SQL server 中有一个叫做 OVER (PARTITION BY id) 的概念,它会产生 id, qty,我们可以再次查询得到正确的结果。

    在 MySQL 中很难获得所需的响应,但下面的链接会有所帮助。

    ->https://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead-lag/

    您应该能够生成如下所示的输出,并且您可以从中查询 sum_all>=40 limit 1;

    id location_key product_key qty sum_all
    6  1            3           25  25
    8  3            3           20  45 
    

    【讨论】:

    • 您的链接将来可能会失效,请提供正确的解释,而不是仅提供链接。
    猜你喜欢
    • 2016-10-03
    • 2021-12-20
    • 2014-10-04
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多