当我想从关系表字段计数时,请帮助我了解总和函数的工作方式。
查询非常简单。我有单位订购的表和单位表。关系为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
但是,我的查询返回:
id 2 = 10 units.
我知道我所做的是5 * 2 = 10;
我的查询有什么问题?
这种关系是这样定义的:
/**
* @return yiidbActiveQuery
*/
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'
您应该使用Hash filter格式->where(['us.id' => 2])
为了获得结果2您需要Innerjoin(您的RAW SQL显示您的左JOIN(,否则不匹配的行
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();
和remeber认为,在MySQL中不允许使用未汇总和不提及的列的选择,以5.7的速度开始使用(无论如何不是SQL中使用组的正确方法(