查询每种类型前N条记录

经常遇到一个表,有多个类别,每个类别,下面有多个小类别,每个小类别下面又有多条记录的情况,要求取出每个大类别下面的三条记录。

数据库;

 

 
  1. CREATE TABLE `NewTable` (

  2. `id` int(11) NOT NULL AUTO_INCREMENT ,

  3. `acar_id` int(11) NOT NULL ,

  4. `ascore_id` int(11) NOT NULL COMMENT '车型评分ID' ,

  5. `score` int(11) NOT NULL COMMENT '评分' ,

  6. `type` int(11) NOT NULL COMMENT '类型(101视觉设计,102触觉质感,103静谧性,211驾驶员头部空间)' ,

  7. `content` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评价' ,

  8. `photo` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片' ,

  9. PRIMARY KEY (`id`)

  10. )

  11. ENGINE=InnoDB

  12. DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

  13. COMMENT='车型评分详情'

  14. AUTO_INCREMENT=1051

  15. ROW_FORMAT=COMPACT

 

数据:

查询每种类型前N条记录

 

需求

对于一个acar_id下面,只显示3小项(视觉设计、触觉质感、静谧性,若该三项未被评价,则顺序后推显示)及3小所属的大项名称及大项分数,点击“全部内容”“文字描述”“图”时,新开标签页查看全部内容

答案:

 

 
  1. SELECT b.`acar_id`,b.`id` ,b.`id` % 3,CONCAT(b.`acar_id`, b.`id` % 3) FROM

  2. `appraise_score_detail` b

  3. WHERE

  4. b.acar_id IN (29,30)

  5. GROUP BY

  6. CONCAT(b.`acar_id`, b.`id` % 3)   ;;这句话是精髓

  7. ORDER BY

  8. b.id


查询每种类型前N条记录

 

 

解释一下:

 

 
  1. GROUP BY

  2. CONCAT(b.`acar_id`, b.`id` % 3)

 

 

如果上面的sql去除 group by是这样的,

 

 
  1. SELECT b.`acar_id`,b.`id` ,b.`id` % 3,CONCAT(b.`acar_id`, b.`id` % 3) FROM

  2. `appraise_score_detail` b

  3. WHERE

  4. b.acar_id IN (29,30)

  5. ORDER BY

  6. b.id

 

效果:

查询每种类型前N条记录

 

将acar_id下面的数据通过CONCAT(b.`acar_id`, b.`id` % 3)分为三种情况,然后在使用groupby