以下是我的数据库表
left_table
id name
1 A
2 B
3 C
4 D
5 E
right_table
id left_table_id size date_time
1 1 xs 2017-06-13 14:20:00
2 3 s 2017-06-13 14:25:00
3 2 xs 2017-06-13 14:27:00
4 1 s 2017-06-13 14:30:00
5 2 m 2017-06-13 14:32:00
6 2 xs 2017-06-13 14:33:00
7 3 xl 2017-06-13 14:40:00
8 4 s 2017-06-13 14:41:00
9 4 m 2017-06-13 14:45:00
10 5 m 2017-06-13 14:46:00
下面是通过max(date_time)DESC获取left_table顺序记录的原始sql查询,其中date_time< = NOW()为以下结果。
SELECT t.id, t.name, r.date_time
FROM left_table AS t
JOIN (
SELECT id, MAX(date_time) AS date_time
FROM right_table
WHERE date_time <= NOW()
GROUP BY id
) AS r ON t.id = r.id
ORDER BY r.date_time DESC;
结果left_table按max(add_time)DESC
排序id name max(add_time)
2 B 2017-06-13 14:33:00
1 A 2017-06-13 14:30:00
3 C 2017-06-13 14:25:00
这是因为date_time
的{{1}}的4和5是&gt;现在()。假设left_table_id
。请注意,left_table_id 3有一个NOW() = 2017-06-13 14::35:00
,但仍然会被选中,因为它有其他正确的记录,add_time > NOW()
。
如何使用add_time <= NOW()
或ActiveRecord
在ActiveQuery
中获得相同的结果? Yii Framework 2
或ActiveRecord
适用于ActiveQuery
Yii GridView
或ActiveDataProvider
Pagination
答案 0 :(得分:0)
你可以用这种方式使用suquery并且左边连接子查询 (假设ChildClass和ParentCLass为相关类 在伪代码中的建议如下)
$subQuery = ChildClass::find()->select( 'id, MAX(date_time) AS date_time')
->having('MAX(date_time) <=now()')
->groupBy('id');
$query = ParentClass::find();
$query->leftJoin('R' => $subquery, 'R.id = parentTable.id' )
->orderBy(['R.date_time'=> SORT_DESC);