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 条数据。这对于限制结果集到特定的爬虫名称非常有用。