mysql根据某字段分组查询,每组取前10个

发布于:2024-02-29 ⋅ 阅读:(61) ⋅ 点赞:(0)

mysql中有一个表叫policy,表的字段有id,title,time,spider_name等等,spider_name是爬虫名称,每个爬虫采集的数据都会有这个标识。请问如何根据spider_name爬虫名称,每一个种类获取10条数据,需要写这个sql语句。

对于 MySQL 5.7 及以下版本,您可以使用变量和子查询来模拟相同的功能。下面是一个示例,它使用了用户定义的变量来为每个 spider_name 获取前 10 条记录:

SET @row_number = 0;  
SET @current_spider = '';  
  
SELECT   
    id,  
    title,  
    `time`,  
    spider_name  
FROM (  
    SELECT   
        id,  
        title,  
        `time`,  
        spider_name,  
        @row_number := IF(@current_spider = spider_name, @row_number + 1, 1) AS row_num,  
        @current_spider := spider_name  
    FROM   
        policy  
    ORDER BY   
        spider_name,  
        `time` DESC  
) AS sorted_data  
WHERE   
    row_num <= 10;

这个查询的工作原理是:

1、使用用户定义的变量 @row_number 和 @current_spider 来跟踪当前的行号和爬虫名称。

2、在子查询中,我们根据 spider_name 和 time 对数据进行排序,并使用 IF 语句和变量来为每个 spider_name 的数据行分配一个行号。

3、外层查询选择行号小于或等于 10 的记录,从而得到每个 spider_name 的前 10 条数据。

要在上面的查询中加入一个过滤条件,仅选择 spider_name 为 'aaa' 或 'bbb' 的记录,您可以在子查询的 WHERE 子句中添加这个条件。以下是修改后的查询:

SET @row_number = 0;  
SET @current_spider = '';  
  
SELECT   
    id,  
    title,  
    `time`,  
    spider_name  
FROM (  
    SELECT   
        id,  
        title,  
        `time`,  
        spider_name,  
        @row_number := IF(@current_spider = spider_name, @row_number + 1, 1) AS row_num,  
        @current_spider := spider_name  
    FROM   
        policy  
    WHERE   
        spider_name IN ('aaa', 'bbb')  
    ORDER BY   
        spider_name,  
        `time` DESC  
) AS sorted_data  
WHERE   
    row_num <= 10;

这个修改确保了只有 spider_name 为 'aaa' 或 'bbb' 的记录会被考虑在内,并且为每个这样的 spider_name 获取前 10 条数据。这对于限制结果集到特定的爬虫名称非常有用。


网站公告

今日签到

点亮在社区的每一天
去签到