MYSQL查询每个分类的第一条数据
封面图
•
2025-12-24
•
MySQL
270
1
1
0
在 MySQL 中,如果你有一个表,比如 `articles`,其中包含字段如 `id`, `category`, `title`, `content` 等,并且你想查询每个分类的第一条数据(比如按时间排序后的第一条),你可以使用以下几种方法来实现。 --- ## ✅ 方法一:使用子查询 + `LIMIT 1` ```sql SELECT a.* FROM articles a WHERE a.id = ( SELECT id FROM articles WHERE category = a.category ORDER BY id ASC LIMIT 1 ); ``` > **说明**:这个方法通过子查询找到每个分类中最小的 `id`(即第一条数据),然后外层查询根据这个 `id` 获取对应行。 --- ## ✅ 方法二:使用窗口函数(MySQL 8.0+ 支持) 如果你使用的是 **MySQL 8.0 或更高版本**,可以使用 `ROW_NUMBER()` 等窗口函数: ```sql WITH ranked_articles AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY id) AS rn FROM articles ) SELECT * FROM ranked_articles WHERE rn = 1; ``` > **说明**:这里按 `category` 分组,按 `id` 排序,给每条记录编号,然后只取编号为 1 的记录。 --- ## ✅ 方法三:使用 `JOIN` 和 `MIN(id)` ```sql SELECT a.* FROM articles a JOIN ( SELECT category, MIN(id) AS min_id FROM articles GROUP BY category ) b ON a.id = b.min_id; ``` > **说明**:先按分类分组,找出每个分类中最小的 `id`,再用 `JOIN` 找到对应的完整记录。 --- ## 📌 注意事项 - 如果你想要的是“每个分类中最新的一条数据”,请把 `ORDER BY id` 改成 `ORDER BY create_time DESC`。 - 如果没有唯一标识字段(如 `id`),可以用 `ROW_NUMBER()` 来替代。 - 如果你的 MySQL 版本低于 8.0,无法使用窗口函数,请使用前两种方法。 --- ## 示例表结构(假设) ```sql CREATE TABLE articles ( id INT PRIMARY KEY AUTO_INCREMENT, category VARCHAR(50), title VARCHAR(255), content TEXT, create_time DATETIME ); ``` --- 如果你能提供具体的表结构和字段名,我可以为你定制更精确的 SQL 查询。
上一篇:
使用mysqldump自动备份mysql数据库
下一篇:
mysql什么是锁?
标题录入,一次不能超过6条
留言
评论