簡體   English   中英

如何將此MySQL查詢轉換為Yii2 ActiveQuery格式?

[英]How to convert this MySQL query to Yii2 ActiveQuery format?

這是我的MySQL查詢

SELECT dc.`dc_key`
,@delivered_qty := (SELECT IFNULL(SUM(dd.`qty`),0)
    FROM `delivery_detail` dd
    WHERE dd.`item_key` = 1
    AND dd.dc_key = dc.dc_key
) AS delivered_qty
,@borrowed_qty := (SELECT IFNULL(SUM(bd.`qty`),0)
    FROM `borrow_detail` bd
    WHERE bd.`item_key` = 1
    AND bd.`voided` = 0
    AND bd.`returned` = 0
    AND bd.`dc_key` = dc.`dc_key`
) AS borrowed_qty
, (@delivered_qty - @borrowed_qty) AS available_qty
FROM `delivery_catalog` dc
WHERE (@delivered_qty - @borrowed_qty) > 0
LIMIT 1

這是我的無限結果 查詢結果

到目前為止,這是我嘗試過的,但效果不佳。

$SQL = ''
. 'SELECT dc.`dc_key` '
. ',@delivered_qty := (SELECT IFNULL(SUM(dd.`qty`),0) '
. '    FROM `delivery_detail` dd '
. '    WHERE dd.`item_key` = :item_key '
. '    AND dd.dc_key = dc.dc_key '
. ') AS delivered_qty '
. ',@borrowed_qty := (SELECT IFNULL(SUM(bd.`qty`),0) '
. '    FROM `borrow_detail` bd '
. '    WHERE bd.`item_key` = :item_key '
. '    AND bd.`voided` = 0 '
. '    AND bd.`returned` = 0 '
. '    AND bd.`dc_key` = dc.`dc_key` '
. ') AS borrowed_qty '
. ', (@delivered_qty - @borrowed_qty) AS available_qty '
. 'FROM `delivery_catalog` dc '
. 'WHERE (@delivered_qty - @borrowed_qty) > 0 '
//. 'LIMIT 1 '
. '';

$rawData = DeliveryDetail::findBySql($SQL, [':item_key' => $item_key])->ALL();

print_r($rawData);

return;

它返回一個空數組。

我想利用yii2的查詢構建器獲得干凈的代碼。

$SQL = ''
. 'SELECT dc.`dc_key` '
. ',@delivered_qty := (SELECT IFNULL(SUM(dd.`qty`),0) '
. '    FROM `delivery_detail` dd '
. '    WHERE dd.`item_key` = :item_key '
. '    AND dd.dc_key = dc.dc_key '
. ') AS delivered_qty '
. ',@borrowed_qty := (SELECT IFNULL(SUM(bd.`qty`),0) '
. '    FROM `borrow_detail` bd '
. '    WHERE bd.`item_key` = :item_key '
. '    AND bd.`voided` = 0 '
. '    AND bd.`returned` = 0 '
. '    AND bd.`dc_key` = dc.`dc_key` '
. ') AS borrowed_qty '
. ', (@delivered_qty - @borrowed_qty) AS available_qty '
. 'FROM `delivery_catalog` dc '
. 'WHERE (@delivered_qty - @borrowed_qty) > 0 '
//. 'LIMIT 1 '
. '';

$rows = \Yii::$app->db->createCommand($SQL)
            ->bindParam(":item_key", $item_key)
            ->queryAll();

應該管用。 如果結果集很大,則可以通過query()使用datareader。

要使用查詢生成器,您需要重寫此查詢,實際上可以在列中沒有變量的情況下完成此查詢。

我認為可以將其重寫為:

SELECT dc.`dc_key` ,
IFNULL(SUM(dd.`qty`),0) as delivered_qty,
IFNULL(SUM(bd.`qty`),0) as borrowed_qty
LEFT JOIN `delivery_detail` dd ON dd.`item_key` = :item_key AND dd.dc_key = dc.dc_key 
LEFT JOIN `borrow_detail` bd ON 
         bd.`item_key` = :item_key 
    AND bd.`voided` = 0 
    AND bd.`returned` = 0 
    AND bd.`dc_key` = dc.`dc_key` 
FROM `delivery_catalog` dc
GROUP BY dc.`dc_key`
HAVING delivered_qty - borrowed_qty > 0 

(@delivered_qty - @borrowed_qty) AS available_qty可以在PHP中完成,這樣的查詢可以毫無問題地轉換為查詢生成器。

暫無
暫無

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

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