mysql分组查询只获取第一条

接到一个需求: 需要获取协议表里所有供应商对应最新的采购员。 由于协议表里供应商的协议会有多个,可能采购员也不是同一个,所以需要做到聚合、筛选才能达到效果.

-- 外层查询:聚合筛选的结果
select
aaa,
bbb,
-- 子查询:查询某个供应商最新的采购员
(
select 
ccc
from
contract
order by create_date desc
limit 1
)
from
contract
group

以上是错误示范! (没有索引的)子查询或者表的自连接会很慢,数据稍微多一点直接超时。 所以我取了个巧: 先根据供应商和创建时间进行排序。外层嵌套查询来进行聚合,聚合后的第一条数据便是我需要的。最后对聚合的数据进行处理即可。 以下为示范SQL:

SELECT
tmp.company_num,
tmp.company_name,
SUBSTRING_INDEX(GROUP_CONCAT(tmp.purchase_agent),,,1)AS purchase_agent
FROM(
	SELECT
	hc.company_num,
	hc.company_name,
	spch.creation_date,
	hpa.purchase_agent_name
	FROM
	pc_header spch
	WHERE
	spch.company_id = 1
	ORDER BY 
	hc.company_num ASC,
	spch.creation_date DESC
)tmp
GROUP BY
tmp.company_num,
tmp.company_name

使用了这个不太常见的字符串处理函数: substring_index(被截取字段,分隔符,关键字出现的次数)

经验分享 程序员 微信小程序 职场和发展