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