gpt4 book ai didi

mysql - Yii2 查询生成器从一对多关系字段求和

转载 作者:行者123 更新时间:2023-11-29 19:03:41 24 4
gpt4 key购买 nike

当我想从关系表字段中进行计数时,帮助我了解 sum 函数的工作原理。

查询非常简单。我有unitsOrdered 表和unitsSent 表。关系是 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 \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 中提及的列(无论如何这不是在 SQL 中使用 group by 的正确方法)

关于mysql - Yii2 查询生成器从一对多关系字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43676789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com