将表中的值与表外的值进行排序,但使用关系

vhmi4jdf  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(308)

在我的数据库中,每个用户可以为每门课程提交4种类型的费率。
我有一张table叫 course 这个表有一列名为 id .
我还有一张table叫 rate_type 记录用户可以提交的4种速率

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

我还有一张table叫 rate 按以下结构记录用户提交的费率

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

我还有一张table叫 rate_value 使用以下结构记录每个课程和每个费率类型的用户费率值:

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

这个 course_idrate 与…有关 idcourse table。 user_id 的关系 rate 这并不重要。 rate_idrate_value 与…有关 idrate table。 type_idrate_value 与…有关 idrate_type 表。(但这并不重要,因为费率类型对课程不重要,费率的绝对和很重要)。
现在我想把 course 从最高比率到最低比率的表格,但比率值在 rate 表格和每门课程都有许多记录 rate 表和排序的课程,我应该加上所有的费率的具体课程在 rate_value 根据每门课程的费率总和对课程进行表格和排序。

$query = Course::find()
                        ->alias("t")
                        ->where(["t.deleted" => 0])
                        ->joinWith([
                             "rate"
                        ]);

我应该补充什么 $query 按定义完成此查询。
这是我想用yii2模型运行的原始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值

czfnxgou

czfnxgou1#

假设模型关系声明为:

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

相关问题