我有一个可能很愚蠢的问题。在 Yii2 中,我有这个 $query (由 self::find() 声明)和一些基本条件:
$query->andWhere(['>=', 'mrd.created', $start_date]);
$query->andWhere(['<=', 'mrd.created', $end_date. ' 23:59:59']);
我想通过此选择返回的结果:从
user_id
到created
和$start_date
同时具有end_date
但不依赖于cons_debit
的
created
$result = $query->select(['mrd.user_id', 'SUM(mrd.actual_revenue) AS total_revenue',
'cons_debit' => new \yii\db\Expression('SUM(CASE WHEN mrd.fail_date BETWEEN :from_date AND :to_date THEN mrd.cons_debit ELSE 0 END)', [
':from_date' => $start_date,
':to_date' => $end_date. ' 23:59:59',
])])
->groupBy(['mrd.user_id'])
->offset(max($params['page'] - 1, 0) * $params['limit'])
->orderBy(['total_revenue'=>SORT_DESC])
->limit($params['limit'])
->asArray()
->all();
我遇到的问题是
cons_debit
选择。我只想检索在 fail_date
和 from_date
之间具有 to_date
的 SUM(cons_debit) (不依赖于 mrd.created
)。
我可以通过 2 个查询得到这个结果,但我想知道是否有任何方法可以在一个查询中实现这一目标。
非常感谢
我找到了答案,这很简单:v
$result = $query->select(['mrd.user_id', 'SUM(mrd.actual_revenue) AS total_revenue',
'(SELECT SUM(cons_debit) FROM mass_revenue_date WHERE user_id = mrd.user_id AND fail_date BETWEEN :from_date AND :to_date) AS cons_debit',])
->groupBy(['mrd.user_id'])
->offset(max($params['page'] - 1, 0) * $params['limit'])
->orderBy(['total_revenue'=>SORT_DESC])
->params([
':from_date' => $start_date,
':to_date' => $end_date,
])
->limit($params['limit'])
->asArray()
->all();