mysql获取每个分类下面的前五条数据

2023-12-21 20:50

本文主要是介绍mysql获取每个分类下面的前五条数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现在项目遇到个问题,我电商网站,商品有很多分类,我想取出每个分类下面的前五条数据,应该怎么做呢?
数据结构如下:


DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(200) COLLATE utf8_unicode_ci NOT NULL COMMENT '商品名称,65字以内',`class_pro_id` mediumint(8) unsigned NOT NULL DEFAULT 0 COMMENT '商品分类id',`description` varchar(600) COLLATE utf8_unicode_ci NOT NULL COMMENT '商品描述,200字以内',`present_price` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT '现价',`original_price` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT '原价',`status` enum('up','down') CHARACTER SET utf8 NOT NULL DEFAULT 'up' COMMENT '商品状态,down表示下架,up表示在架',`image` text COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '商品主图,最多6张',`content` text COLLATE utf8_unicode_ci NOT NULL COMMENT '商品详情',`sort` mediumint(9) NOT NULL DEFAULT 0 COMMENT '商品排序,越大越靠前',`taobao_url` varchar(300) COLLATE utf8_unicode_ci NOT NULL COMMENT '淘宝链接',`weixin_url` varchar(300) COLLATE utf8_unicode_ci NOT NULL COMMENT '微信链接',`created_at` timestamp NULL DEFAULT NULL,`updated_at` timestamp NULL DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

图片描述

  • 2017年09月28日提问
  • 1 评论
  • 邀请回答
  • 编辑
  •  

6个回答

1


已采纳

1.

SELECT a.*
FROMproducts AS a
WHERE(SELECT COUNT(*)FROMproducts AS bWHEREb.class_pro_id = a.class_pro_id AND b.id >= a.id) <= 5
ORDER BY a.class_pro_id ASC , a.id DESC

select a.goods_id,a.goods_name,a.cate_id,count(*) as num from goods as a

inner join goods as b on a.cate_id=b.cate_id where a.goods_id>=b.goods_id 

group by a.goods_id having num<=5 order by a.cate_id asc,a.goods_id asc

//注:一个表自己内连接自己,使其cate_id对等,且a.goods_id>=b.goods_id。最后group by a.goods_id having num<=5

2.

SELECT a.*
FROMproducts AS a,(SELECT GROUP_CONCAT(id order by id desc) AS idsFROMproductsGROUP BY class_pro_id) AS b
WHEREFIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 5
ORDER BY a.class_pro_id ASC, a.id DESC;

 

3.

select a.*,count(*) as num from products as a inner join products as b ON a.class_pro_id=b.class_pro_id 

where b.id<=a.id group by a.id having num<=2;

 

 

 

 

 

 

 

group_concat得到每组用逗号分隔的列值,最大长度可以通过group_concat_max_len环境变量设置。
find_in_set返回id在ids中的位置,不存在返回0。

  • 2017年09月29日更新
  • 5 评论
  • 赞赏
  • 编辑

qiboda160 声望

1

是题主表述不清吗?我觉得挺清楚的啊,下面几位完全跑题!@yaohuiye这位还搭点边,可是差个排序,即使是按照id顺序取值也应该加上才好,还有这写法简直是灾难!每组取前5条,不是取5个组就好了
mysql可以引入组内行号解决


select id,name,class_pro_id,... 
from (select @gn:=case when @class_pro_id=class_pro_id then @gn+1 else 1 end gn,@class_pro_id:=class_pro_id,id,name,...from products a ,(select @gn:=1) b order by class_pro_id,id) aa
where gn<=5;    

 

select @cod:=case when @cate_id=cate_id then @cod+1 else 1 end cod,
@cate_id:=cate_id,goods_id,goods_name,cate_id from goods as a,
(select @cod:=0) as b order by cate_id asc,goods_id asc//对于SET,可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符:
 select goods_id,goods_name,cate_id,@a:= case when @cid=cate_id then @a+1 else 1 end as num,ifnull(@a,@a:=0),@cid:=cate_id from goods 
order by cate_id asc,  goods_id asc//注:如果变量@a没有被设置过会返回null,用ifnull(@a,@a:=0) 这样可以设置变量@a=0 初始化变量

 

 

 

 


SELECT name, '分类1' AS type_name FROM products WHERE class_pro_id = 1 LIMIT 5
UNION
SELECT name, '分类2' AS type_name FROM products WHERE class_pro_id = 2 LIMIT 5
UNION
SELECT name, '分类3' AS type_name FROM products WHERE class_pro_id = 3 LIMIT 5
  •  

这篇关于mysql获取每个分类下面的前五条数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/521466

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意