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

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re