从表中的值排序表但具有关系

时间:2018-05-30 11:02:42

标签: mysql yii2

在我的数据库中,每个用户可以为每门课程提交4种费率。

我有一个名为course的表,此表有一个名为id的列。

我有另一个名为rate_type的表来记录用户可以提交的4种费率

-------------
| id | type |
-------------

我有另一个名为rate的表来记录以记录用户提交的费率,具有以下结构

----------------------------
| id | user_id | course_id |
----------------------------

我还有另一个名为rate_value的表来记录我的用户每个课程的费率值以及每种费率类型,其结构如下:

----------------------------------
| id | rate_id | value | type_id |
----------------------------------

course_id中的rateid表中的course有关系。 user_id中的rate关系并不重要。 rate_id中的rate_valueid表中的rate有关。 type_id中的rate_valueid表中的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

返回更大的数字

1 个答案:

答案 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";
}