在我的数据库中,每个用户可以为每门课程提交4种费率。
我有一个名为course
的表,此表有一个名为id
的列。
我有另一个名为rate_type
的表来记录用户可以提交的4种费率
-------------
| id | type |
-------------
我有另一个名为rate
的表来记录以记录用户提交的费率,具有以下结构
----------------------------
| id | user_id | course_id |
----------------------------
我还有另一个名为rate_value
的表来记录我的用户每个课程的费率值以及每种费率类型,其结构如下:
----------------------------------
| id | rate_id | value | type_id |
----------------------------------
course_id
中的rate
与id
表中的course
有关系。
user_id
中的rate
关系并不重要。
rate_id
中的rate_value
与id
表中的rate
有关。
type_id
中的rate_value
与id
表中的rate_type
有关系。(但这并不重要,因为费率类型对于课程并不重要,因此费率的总和是重要)。
现在我想将course
表从最高速率排序到最低,但速率值在rate
表中,每个课程在rate
表中有很多记录,用于排序课程,我应该在rate_value
表格中总结该特定课程的所有费率,并按每门课程的费率总和对课程进行排序。
$query = Course::find()
->alias("t")
->where(["t.deleted" => 0])
->joinWith([
"rate"
]);
我应该向$query
添加什么来完成定义的查询。
这是我想用yii2 Model
运行的原始sql查询SELECT t.id, t.title, SUM(rate_value.value) FROM `course` `t`
LEFT JOIN rate
ON rate.course_id = t.id
LEFT JOIN rate_value
ON rate_value.rate_id = rate.id
GROUP BY t.id
ORDER BY SUM(rate_value.value) DESC
UPDATE1: 此查询工作正常但当我将其他东西加入此查询时,这将为SUM
返回更大的数字答案 0 :(得分:0)
假设您将模型关系声明为:
class Course extends ActiveRecord {
public static function tableName() {
return 'course';
}
public function getRates(){
return $this->hasOne(RateValue::class, ['rate_id' => 'id'])
->viaTable('rate', ['course_id' => 'id']);
}
}
class RateValue extends ActiveRecord {
public static function tableName() {
return 'rate_value';
}
}
您可以通过以下方式构建此类查询:
$result = Course::find()
->select([
't.id',
't.title',
'sum' => 'SUM(rate_value.value)'
])
->alias('t')
->joinWith(['rates'])
->groupBy(['t.id'])
->orderBy(new \yii\db\Expression('SUM(rate_value.value) DESC'))
->asArray()
->all();
显示结果:
foreach ($result as $row) {
echo "{$row['title']} - {$row['sum']}\n";
}