发布时间:2022-02-10 13:54:26 阅读次数:336
mysql> select * from test;
+----+-------+------+-------+
| id | name | age | class |
+----+-------+------+-------+
| 1 | qiu | 22 | 1 |
| 2 | liu | 42 | 1 |
| 4 | zheng | 20 | 2 |
| 3 | qian | 20 | 2 |
| 0 | wang | 11 | 3 |
| 6 | li | 33 | 3 |
+----+-------+------+-------+
6 rows in set (0.00 sec)
[sql] view plain copy
mysql> select id,name,max(age),class from test group by class;
+----+-------+----------+-------+
| id | name | max(age) | class |
+----+-------+----------+-------+
| 1 | qiu | 42 | 1 |
| 4 | zheng | 20 | 2 |
| 0 | wang | 33 | 3 |
+----+-------+----------+-------+
3 rows in set (0.00 sec)
虽然找到的age是最大的age,但是与之匹配的用户信息却不是真实的信息,而是group by分组后的第一条记录的基本信息。
[sql] view plain copy
mysql> select * from (
-> select * from test order by age desc) as b
-> group by class;
+----+-------+------+-------+
| id | name | age | class |
+----+-------+------+-------+
| 2 | liu | 42 | 1 |
| 4 | zheng | 20 | 2 |
| 6 | li | 33 | 3 |
+----+-------+------+-------+
3 rows in set (0.00 sec)
select * from test t where t.age = (select max(age) from test where t.class = class) order by class;
在laravel中的使用
$maxList=DB::table('data')->select('id','report_at','column_value','day')
->whereBetween('report_at',[$param['start_time'],$param['end_time'].' 23:59:59'])
->where(['column_name'=>$columnName,'monitor_id'=>$monitor_id])->orderBy('column_value','desc');
$result = DB::(data')->select('report_data.id','report_data.report_at','report_data.column_value','report_data.day')
->joinSub($maxList,'maxList', function($join) {
$join->on('report_data.id', '=', 'maxList.id');
})
->groupBy('report_data.day')->get()->toArray();