MySQL使用group by时展示最后一条的数据

MySQL使用group by时,默认展示的数据都是数据库的第一条,这时使用order by是无效的
要展示最新一条数据的某些字段,一般通过SUBSTRING_INDEX截取获得获取
如果是时间,ID这种递增类型的,则可以使用max
例如要从充值表最新一条数据的入库时间

//max跟SUBSTRING_INDEX都可以实现
  $data=Db::name("recharge")
            ->field("max(createTime) as createTime,SUBSTRING_INDEX(group_concat(createTime order by id desc),',',1) as createTime2")
            ->limit(10)
            ->group("playerId")
            ->select();
//SQL: SELECT max(createTime) as createTime,SUBSTRING_INDEX(group_concat(createTime order by id desc),',',1) as createTime2 FROM `recharge` GROUP BY `playerId` LIMIT 10
//createTime 跟createTime2 都是最新的一条数据的创建时间

例如要获取充值表最新一条数据的的充值金额,这次就只能用SUBSTRING_INDEX了

 $data=Db::name("recharge")
            ->field("SUBSTRING_INDEX(group_concat(cost order by id desc),',',1) as cost")
            ->limit(10)
            ->group("playerId")
            ->fetchSql(true)
            ->select();
#SQL:SELECT SUBSTRING_INDEX(group_concat(cost order by id desc),',',1) as cost FROM `recharge` GROUP BY `playerId` LIMIT 10

拓展

group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

将 group by 产生的同一个分组中的值连接起来,返回一个字符串结果。
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,默认为一个逗号。默认最长1024

//通过id倒序把cost取出来,并且用逗号拼接
SELECT group_concat(cost order by id desc) as cost FROM `recharge` GROUP BY `playerId` LIMIT 1
//结果 2.99,1.99,3.99

substring_index(“待截取有用部分的字符串”,“截取数据依据的字符”,截取字符的位置N)

//以第一个逗号为分割截取
SELECT SUBSTRING_INDEX(group_concat(cost order by id desc),',',1) as cost FROM `recharge` GROUP BY `playerId` LIMIT 1 
//结果2.99

你可能感兴趣的:(MySQL使用group by时展示最后一条的数据)