mysql根据某字段分组查询,每组取前10个
mysql中有一个表叫policy,表的字段有id,title,time,spider_name等等,spider_name是爬虫名称,每个爬虫采集的数据都会有这个标识。这个修改确保了只有 spider_name 为 'aaa' 或 'bbb' 的记录会被考虑在内,并且为每个这样的 spider_name 获取前 10 条数据。要在上面的查询中加入一个过滤条件,仅选择 spider_name 为
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 条数据。这对于限制结果集到特定的爬虫名称非常有用。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)