方法一: 针对有 分类字段

 

专题id 即 该表的分类字段

// 文章表:
CREATE TABLE `er_article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `theme_id` int(11) DEFAULT NULL COMMENT  '专题id',
  `title` varchar(50) NOT NULL,
  `update_time` int(11) NOT NULL,
)

 

查询sql: 查询 每个专题的 前3篇文章

SELECT 
    a.id,a.title,a.update_time,a.theme_id
FROM
    ( 
		
     er_article AS a,
    (SELECT 
        GROUP_CONCAT(id) AS ids
    FROM
        er_article
    GROUP BY 
		theme_id ) AS b 
		
    )  
WHERE
    FIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 3 
ORDER BY a.theme_id

 

 

语句解析1:

SELECT 
        GROUP_CONCAT(id) AS ids
    FROM
        er_article
    GROUP BY theme_id

该语句运行结果:

mysql查询数据前五条 mysql分类查询前5条数据_数据

 GROUP_CONCAT(id) as ids 表示 将所有id 存入一个数组字符串ids. 若不加group by  theme_id 分类, 则所有id存在一条数据中

 

 

语句解析2:

 FIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 3

   FIND_IN_SET(id,ids) 表示匹配字符串中对应的id,BETWEEN 1 AND 3 表示取前三条数据

 

 

 结果如下。( ps:测试数据有我同学名,所以就码掉了,怪输入法呀哈哈~) 

mysql查询数据前五条 mysql分类查询前5条数据_mysql_02

 

方法二: 针对无 分类字段 的表 ,需要筛选到 某个字段 无重复值

 

// 奖励详细表  (展示部分字段)
CREATE TABLE `admin_welfare_detail` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `game` varchar(255) DEFAULT NULL,
  `name` varchar(255) NOT NULL DEFAULT '' ,
  `platform` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
  `server` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
  `accname` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  `player_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  `player_lv` int NOT NULL ,
  `reward_type` int NOT NULL ,
  `config_money` varchar not null,
  `player_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '',
)

 

查询sql:查询每个 玩家id 的 前2条数据

SELECT
	a.id,
	a.player_id,
	a.name,
	a.config_money
FROM
	admin_welfare_detail a 
WHERE
	(
	SELECT
		count(*) 
	FROM
		admin_welfare_detail b 
	WHERE
		a.player_id = b.player_id 
		AND a.game = b.game 
		AND a.platform = b.platform 
		AND a.reward_type = b.reward_type 
		AND a.server = b.server 
		AND b.config_money > a.config_money   
	) < 2 
    
ORDER BY
	id


1.这堆a.x=b.x 是为了确认对比数据的一一对应,config_money那里,是为了获取最高金额的前n条。

mysql查询数据前五条 mysql分类查询前5条数据_字段_03

 (如果要取 后n条,子查询条件改成  a.config_money < b.config_money。)

 

eg:比如说一张成绩表,有字段 id,课程名,学生名,分数,要获取每科成绩最高分的前两个学生,此时这里的条件就变成 where a.课程名=b.课程名,然后获取条件就是a.分数>b.分数

 

 

2. 整条sql语句的意思是,先执行

mysql查询数据前五条 mysql分类查询前5条数据_数据_04

查出所有数据来,先把这个总数据叫A1

    然后子查询针对 A1每条数据 进行 select count(*) from admin_welfare_detail b where xxx b.config_money > a.config_money   

   假如说一个角色有3条数据,金额分别是 50 60 100, 那么执行流程就是:

  第一轮,a.config_money = 50,那么有 60,100 大于50的,此时count=2 ,不符合 

  第二轮,a.config_money = 60,那么有 100 大于60的,此时count=1 ,符合 

  第三轮,a.config_money = 100,没有值大于100的,此时count=0 ,符合 

  我们上面sql语句里面是  <2   所以60、100符合条件。

 

结果:(有些数据数据库只有一条 ~)

mysql查询数据前五条 mysql分类查询前5条数据_mysql取每个分类前3个_05