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(被截取字段,分隔符,关键字出现的次数)