mysql 查询每个分类的第一条数据 应该怎么写

比如:
分类表里有分类c1,c2,c3
id name
1 c1
2 c2
3 c3

数据表有字段id,分类cid,title,content
id cid title content
1 1 第一条 内容
2 1 第二条 内容2
3 2 第三条 内容3
4 3 第四条 内容4
5 2 第五条 内容5
6 1 第六条 内容6

那么,我如何用一句sql查询列出c1,c2,c3的最新一条数据

如果我用group by cid 显示的是每个分类的早一条记录

select * from csdn1 a,csdn2 b
where a.id=b.cid
and b.id =(select max(id) from csdn2 c where c.cid=a.id)
order by a.id

把你的表结构贴出来,你的分类表是在呢么和数据表关联的,你的数据表应该有时间字段吧,最新时间的就是最新一条了

俩表关联查询根据分类id group by 然后根据时间、字段id排序 获取分组第一条数据就OK 了。

直接有时间的话order by time desc group by cid;没时间但主键自增长的话,就order by id desc group by cid
在selsect 后面 加top1 限制第一条,或者用limit

select x, max(time) group by cid ;

SELECT A.cid,max(A.id) FROM goods A
LEFT JOIN category B ON A.cid = B.id
GROUP BY A.cid

SELECT
MAX(su.id)
FROM
数据 su,
分类 f
WHERE
su.分类id = f.id
GROUP BY f.id

如果你的数据id是数值就可以直接取最大的如果不是就找个可以排序的字段

默认数据表中有created字段(数据插入时间),type字段(关联分类表里面c1,c2,c3值)
select * from
数据表 d
RIGHT JOIN

(select type,max(created) created from 数据表 group by type) m
on m.type=u.type and m.created = u.created;

先group by 再order by 取出呗

先按id 倒序排序下再group by 就可以了(引用后面发的那条问题的采纳答案加以修正)
select * from (SELECT * FROM topic where cid in(1,2,3) order by id desc limit 0,10000) T group by T.cid

原因:limit 0,10000可以让子查询先查询。而之前的语句也是group by 先于 order by执行。

使用limit和order by去写,很容易的

select 数据表.*,分类表.name from 数据表 join 分类表 on 数据表.cid = 分类表.id where cid in (select cid from 数据表 group by cid) order by id desc

SELECT * FROM(
select * from tablename group by cid ,id desc
)as base
group by cid

select * from (
select * from stu group by type, score desc
) as base
group by type

select * from (select *,ROW_NUMBER() over(partition by cid order by id desc) as rn from topic)x where rn =1