mysql 如何獲取每一組建立時間最小的記錄

2021-08-13 09:12:08 字數 2975 閱讀 8180

需求:要根據每種店鋪型別獲取到建立時間最早的那條記錄

表結構如下:

create table `finance_rent_mode_dealer` (

`id` int(11) unsigned not null auto_increment comment '主鍵id',

`dealerid` int(11) not null default '0' comment '商家id',

`type` tinyint(3) not null default '0' comment '型別 1,自營;2,4s店鋪;',

`rent_price` decimal(10,2) not null default '0.00' comment '直租**(萬元)',

`modeid` int(11) not null default '0' comment '車型id',

`createid` int(11) not null default '0' comment '建立人id',

`createtime` timestamp not null default current_timestamp comment '建立時間',

`updateid` int(11) not null default '0' comment '修改人',

`updatetime` timestamp not null default current_timestamp on update current_timestamp comment '修改時間',

`status` tinyint(3) not null default '0' comment '狀態 1,生效;0,失效;',

`seriesid` int(11) not null default '0' comment '車系id',

`brandid` int(11) not null default '0' comment '品牌id',

`rent_status` tinyint(3) not null default '-1' comment '直租狀態 (-2=車型亮點無效,-1=直租方案無效,1=上架,2=下架)',

primary key (`id`),

key `idx_dealerid` (`dealerid`),

key `idx_modeid` (`modeid`,`status`,`type`)

) engine=innodb auto_increment=1 default charset=utf8 comment='金融商家車型關聯表(直租)';

實現該需求有兩種方案

第一種方案:先排序後分組

select * from (select a1.modeid,a1.type,a1.createtime,a1.dealerid,status,rent_status,brandid,a1.seriesid 

from finance_rent_mode_dealer a1

where a1.status=1 and a1.rent_status=1

order by a1.modeid desc,a1.type desc, a1.createtime asc) a

group by a.modeid desc,a.type desc

order by null;

### 先排好序,然後分組的時候會自動獲取到第一條資料,資料量會多一些

第二種方案:先分組後排序

select a1.modeid,a1.type,substring_index(group_concat(dealerid order by createtime asc),',',1) dealerid,status,rent_status

from finance_rent_mode_dealer a1

where a1.status=1 and a1.rent_status=1

group by a1.modeid desc,a1.type desc;

### 分組的過程實際上就已經有序了,而且不用巢狀就能獲取到想要的結果,主要是用group_contact語句

最終結果對比:

select @@profiling;

##set profiling=1; ###測試接下來兩句的效能

select sql_no_cache modeid,type,substring_index(group_concat(dealerid order by createtime asc),',',1) dealerid

from finance_rent_mode_dealer

where status=1 and rent_status=1

group by modeid desc,type desc;

select sql_no_cache * from (select a1.modeid,a1.type,a1.createtime,a1.dealerid,status,rent_status,brandid,a1.seriesid

from finance_rent_mode_dealer a1

where a1.status=1 and a1.rent_status=1

order by a1.modeid desc,a1.type desc, a1.createtime asc) a

group by a.modeid desc,a.type desc

order by null;

show profiles; ###顯示出每乙個sql語句的執行時間

最終結果:

從結果上可以看出,因為先分組的結果使用了大量的函式,導致效能反而沒有先排序後分組的優秀,看來sql語句中使用函式是不可取的。

appium獲取一組元素

import os import time import base64 desired caps desired caps platformname android desired caps platformversion 7.1 desired caps devicesname 192.168.5...

程式設計題 每K個一組反轉鍊錶

反轉鍊錶的高階版。給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。public static listnode reverselist listnode head,int k ...

每k個一組反轉鍊錶 python版

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。說明 你需要自行定義鍊錶結構,將輸入的資料儲存到你的鍊錶中 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換 你的演...