[英]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.