【问题标题】:Reducing queries Yii2减少查询 Yii2
【发布时间】:2018-12-03 12:06:12
【问题描述】:

我真的坚持这个。

我有一张有合同的桌子,还有一张有物品的桌子。 我m trying to achieve is to see the total quantity of an item on contracts in a date range for every day. For example, item1 appears on 3 contracts on Monday and the total quantity is 30. Currently, Im 在所选日期范围内的每一天都在做一个 while 循环并使用此查询

$itemQty = ContItems::find()
            ->where(['ITEMNO' => $itemNo])
            ->andWhere(['<=' , 'HIREDATE' , $today])
            ->andWhere(['>=' , 'ESTRETD' , $today])
            ->andWhere(['or',
                ['STATUS' => 0],
                ['STATUS' => 1]
            ])
            ->SUM('QTY');

它工作正常,但我想检查我在所选日期范围内每天拥有的每个项目,如果我这样做,查询数量会上升到 50k+。

我试图做的是选择日期范围内的每个合约并存储在一个数组中 每份合同都有开始和结束日期,我想选择开始或结束日期在我指定的日期范围内的每份合同。

$ContItemsArray = ContItems::find()
            ->where(['or',
                        ['<=' , 'HIREDATE' , $dateFrom],
                        ['<=' , 'HIREDATE' , $dateTo],
                        ['>=' , 'HIREDATE' , $dateFrom],
                        ['>=' , 'ESTRETD' , $dateTo],
                        ['>=' , 'ESTRETD' , $dateFrom]
                    ])
            ->andWhere(['or',
                ['STATUS' => 0],
                ['STATUS' => 1]
            ])
            ->asArray()
            ->all();

并使用此代码计算数量

$theQty = 0;    
        foreach ($ContItemsArray as $subArray) 
        {   
            if ($subArray['ITEMNO'] == $itemNo && ($subArray['HIREDATE'] <= $today && $subArray['ESTRETD'] >= $today) && ($subArray['STATUS'] <= 1))
            {   
                $theQty += $subArray['QTY'];
            }
            else 
            {
                $theQty += 0;
            }       
        }

但它返回的数字不正确,由于某种原因缺少合同,我无法弄清楚原因。 我试图改变 $ContItemsArray 的查询,但没有运气。 我希望我对这个问题足够清楚。 我将不胜感激。

编辑: ContItems 表包含项目编号为“ITEMNO”的所有合同,开始日期为“HIREDATE”,结束日期为“ESTRETD”,数量为“QTY”字段。

我有一个包含我想要检查的所有项目编号的数组。 预期结果是,如果我检查的日期介于合同开始日期和结束日期之间,则将项目数量相加。

【问题讨论】:

  • 我还不清楚。您能否也提供示例数据和预期输出?

标签: mysql sql arrays yii2


【解决方案1】:

我解决了这个问题,必须在来自表(HIREDATE,ESTRETD)的日期上使用 date('Y-m-d') 和 strtotime,现在它工作正常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多