Mysql - 获取每个分类下面前几条数据

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

数据库;

CREATE TABLE `NewTable` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`acar_id`  int(11) NOT NULL ,
`ascore_id`  int(11) NOT NULL COMMENT '车型评分ID' ,
`score`  int(11) NOT NULL COMMENT '评分' ,
`type`  int(11) NOT NULL COMMENT '类型(101视觉设计,102触觉质感,103静谧性,211驾驶员头部空间)' ,
`content`  varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评价' ,
`photo`  varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片' ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='车型评分详情'
AUTO_INCREMENT=1051
ROW_FORMAT=COMPACT


数据:



需求

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

答案:

SELECT b.`acar_id`,b.`id`  ,b.`id` % 3,CONCAT(b.`acar_id`, b.`id` % 3) FROM
 `appraise_score_detail` b
WHERE
	b.acar_id IN (29,30)
GROUP BY
	CONCAT(b.`acar_id`, b.`id` % 3)
ORDER BY
	b.id



解释一下:

GROUP BY
	CONCAT(b.`acar_id`, b.`id` % 3)

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

SELECT b.`acar_id`,b.`id`  ,b.`id` % 3,CONCAT(b.`acar_id`, b.`id` % 3) FROM
 `appraise_score_detail` b
WHERE
	b.acar_id IN (29,30)
ORDER BY
	b.id

效果:



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


下面的链接是同样的问题,不过是别的解决方案:

https://segmentfault.com/q/1010000011404345/a-1020000011404530

可以参考。



还有遇到过这种写法的,可以提供思路。

第一种:

SELECT
a.*
FROM
appraise_score_detail a
LEFT JOIN appraise_score_detail b
on a.acar_id = b.acar_id  AND a.score > b.score
where a.acar_id IN (11, 12, 13)
GROUP BY a.id
HAVING COUNT(a.id)<3
ORDER BY a.acar_id desc


第二种:

SELECT
  a.*

FROM
  appraise_score_detail a
WHERE
  (SELECT COUNT(1)
   FROM appraise_score_detail b
   WHERE 
     a.acar_id = b.acar_id
     AND a.score >=b.score
  ) < 3;


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MySQL获取分组数据可以使用以下两种方法: 方法一:使用子查询和LIMIT子句 可以使用子查询和LIMIT子句来获取每个分组中的几条数据。例如,以下是一个示例查询,它获取每个教师的3名学生的数据: ``` SELECT t.*, s.* FROM teacher t JOIN ( SELECT * FROM student WHERE teacherId IN ( SELECT DISTINCT teacherId FROM student ) ORDER BY score DESC LIMIT 3 ) s ON t.id = s.teacherId; ``` 这个查询首先在子查询中获取每个教师的3名学生的数据,然后将结果与教师表进行连接,以获取教师和学生的相关信息。 方法二:使用窗口函数和RANK()函数 如果你的MySQL版本支持窗口函数,你可以使用RANK()函数来获取每个分组中的排名数据。以下是一个示例查询,它获取每个教师的排名第一的学生的数据: ``` WITH st AS ( SELECT *, RANK() OVER (PARTITION BY teacherId ORDER BY score DESC) AS rank FROM student ) SELECT t.*, s.* FROM teacher t JOIN st s ON t.id = s.teacherId WHERE s.rank = 1; ``` 这个查询使用RANK()函数对每个教师的学生按照分数进行排名,然后将排名为1的学生与教师表进行连接,以获取教师和学生的相关信息。 请注意,以上两种方法都是基于你提供的引用内容\[1\]和\[2\]进行的解答。同时,如果你在使用方法二时遇到了报错,可能是因为你的MySQL版本较新,需要根据引用内容\[3\]中提到的only_full_group_by设置进行调整。 #### 引用[.reference_title] - *1* *2* *3* [mysql获取分组中的指定数据(附四大排序函数说明)](https://blog.csdn.net/worilb/article/details/116997971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值