首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 分组取第一行

基础概念

MySQL 分组取第一行通常是指在一个查询中对数据进行分组,并从每个分组中选择第一条记录。这在处理聚合数据时非常有用,例如,当你需要获取每个类别的最新记录或最顶端的记录时。

相关优势

  1. 数据聚合:可以快速获取每个分组的关键信息。
  2. 性能优化:相比于对每个分组进行单独查询,这种方法更加高效。
  3. 灵活性:可以根据不同的分组条件获取所需的数据。

类型

  1. 使用窗口函数:如 ROW_NUMBER(), RANK(), DENSE_RANK() 等。
  2. 使用子查询:结合 GROUP BYORDER BY
  3. 使用变量:在查询中使用变量来标记每组的行号。

应用场景

  • 获取每个类别的最新订单。
  • 获取每个部门的最高薪资员工。
  • 获取每个时间段内的第一条日志记录。

示例问题及解决方案

问题:如何使用 MySQL 查询每个类别的第一条产品记录?

假设我们有一个 products 表,结构如下:

代码语言:txt
复制
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category_id INT,
    name VARCHAR(255),
    created_at TIMESTAMP
);

解决方案

使用窗口函数

代码语言:txt
复制
SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY created_at DESC) as rn
    FROM products
) t
WHERE t.rn = 1;

使用子查询

代码语言:txt
复制
SELECT p1.*
FROM products p1
JOIN (
    SELECT category_id, MIN(created_at) as min_created_at
    FROM products
    GROUP BY category_id
) p2 ON p1.category_id = p2.category_id AND p1.created_at = p2.min_created_at;

使用变量

代码语言:txt
复制
SET @row_number = 0;
SET @category_id = NULL;

SELECT *
FROM (
    SELECT *,
           @row_number := IF(@category_id = category_id, @row_number + 1, 1) as row_number,
           @category_id := category_id
    FROM products
    ORDER BY category_id, created_at DESC
) t
WHERE t.row_number = 1;

参考链接

通过上述方法,你可以根据不同的需求选择合适的方式来获取每个分组的第一行记录。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券