来自一对多关系字段的 Yii2 querybuilder 总和
Yii2 querybuilder sum from a one-many relation field
当我想从关系 table 字段中计算时,请帮助我了解求和函数的工作原理。
查询非常简单。我有 unitsOrdered table 和 unitsSent table。关系是 1-n。所以我想计算特定订单的所有已发送单位。在这个例子中顺序 id=2
;
我的数据库里有数据。
已订购单位:
id
1
2
发送单位:
id | order_id | units
1 | 1 | 5
2 | 2 | 2
我的查询是:
query = OrderedUnits::find()
->select([
'ou.*',
'sum(us.units) as alreadySent'
])
->joinWith('unitsSent us')
->where(['ou.id' => 2])
->orderBy('ou.id desc')
->groupBy(['ou.id'])
->all();
结果应该很清楚了:
id 2 = 2 units
然而,我的查询 returns:
id 2 = 10 units.
据我所知我做的是 5 * 2 = 10;
我的查询有什么问题?
关系定义如下:
/**
* @return \yii\db\ActiveQuery
*/
public function getUnitsSent()
{
return $this->hasMany(UnitsSent::className(), ['order_id' => 'id'])
->from(['us' => UnitsSent::tableName()]);
}
实际查询:
'SELECT `ou`.*, sum(us.sent_units) as alreadySent FROM `ordered_units` `ou`
LEFT JOIN `units_sent` `us` ON `ou`.`id` = `us`.`order_id`
WHERE (`ou`.`id`= 2)
GROUP BY `ou`.`id`
ORDER BY `ou`.`id` DESC'
你应该这样使用哈希过滤器格式->where(['us.id' => 2])
为了得到结果 2,你需要 innerJoin(你的原始 sql 显示你有一个左连接)否则不匹配的行也会被连接
query = OrderedUnits::find()
->select([
'ou.*',
'sum(us.units) as alreadySent'
])
->innerJoinWith('unitsSent us')
->where(['us.id' => 2])
->orderBy('ou.id desc')
->groupBy(['ou.id'])
->all();
并尝试检查使用
执行的真实查询
echo $query->createCommand()->getRawSql();
并记住,从 5.7 开始,mysql 中不允许选择未聚合且未在 group by 中提及的列(无论如何都不是使用 group by 的正确方法SQL)
当我想从关系 table 字段中计算时,请帮助我了解求和函数的工作原理。
查询非常简单。我有 unitsOrdered table 和 unitsSent table。关系是 1-n。所以我想计算特定订单的所有已发送单位。在这个例子中顺序 id=2
;
我的数据库里有数据。
已订购单位:
id
1
2
发送单位:
id | order_id | units
1 | 1 | 5
2 | 2 | 2
我的查询是:
query = OrderedUnits::find()
->select([
'ou.*',
'sum(us.units) as alreadySent'
])
->joinWith('unitsSent us')
->where(['ou.id' => 2])
->orderBy('ou.id desc')
->groupBy(['ou.id'])
->all();
结果应该很清楚了:
id 2 = 2 units
然而,我的查询 returns:
id 2 = 10 units.
据我所知我做的是 5 * 2 = 10;
我的查询有什么问题?
关系定义如下:
/**
* @return \yii\db\ActiveQuery
*/
public function getUnitsSent()
{
return $this->hasMany(UnitsSent::className(), ['order_id' => 'id'])
->from(['us' => UnitsSent::tableName()]);
}
实际查询:
'SELECT `ou`.*, sum(us.sent_units) as alreadySent FROM `ordered_units` `ou`
LEFT JOIN `units_sent` `us` ON `ou`.`id` = `us`.`order_id`
WHERE (`ou`.`id`= 2)
GROUP BY `ou`.`id`
ORDER BY `ou`.`id` DESC'
你应该这样使用哈希过滤器格式->where(['us.id' => 2])
为了得到结果 2,你需要 innerJoin(你的原始 sql 显示你有一个左连接)否则不匹配的行也会被连接
query = OrderedUnits::find()
->select([
'ou.*',
'sum(us.units) as alreadySent'
])
->innerJoinWith('unitsSent us')
->where(['us.id' => 2])
->orderBy('ou.id desc')
->groupBy(['ou.id'])
->all();
并尝试检查使用
执行的真实查询echo $query->createCommand()->getRawSql();
并记住,从 5.7 开始,mysql 中不允许选择未聚合且未在 group by 中提及的列(无论如何都不是使用 group by 的正确方法SQL)