公司积分商城业务需求:
每个商品归于一种品类,在首页展示一个品类展示四个商品,前端下拉刷新展示新的品类,新的品类下面至多只展示四个商品
这里需要写一个不是分页数据的分页查询
根据业务需求 商品和品类是多对多的关系 现在有三张表
shop_goods —商品表
shop_goods_type_rel —商品品类关联表
shop_goods_type —品类表
解决思路,将所有商品按品类字段查出,同时加上变量rank计数,rank只计算同一品类的商品个数,限制rank小于等于4
SELECT
a.goods_code,
a.goods_name,
a.goodsTypeCode,
a.goodsTypeName,
IF (
@tmp = goodsTypeCode ,@rank :=@rank + 1,@rank := 1
) AS new_rank,
@tmp := goodsTypeCode AS tmp
FROM
(
SELECT
t.goods_name,
t.goods_code,
s.level_one_code AS goodsTypeCode,
g.NAME AS goodsTypeName
FROM
t_shop_goods t
RIGHT JOIN t_shop_goods_type_detail s ON t.goods_code = s.goods_code
LEFT JOIN t_shop_goods_type g ON g.type_id = s.level_one_code
ORDER BY
g.sort,
s.level_one_code,
t.sale_price
) a
可以将
这里@rank @tmp 都用到了mysql的变量
变量分为局部变量,用户变量,会话变量,全局变量
此处@的写法为用户变量
用户变量类似于java中对象的成员变量,在不做set处理的时候,变量值永远不会改变,就是说@rank @tmp在不做处理的时候,这条sql执行的时候这两个值不会改变,
变量复制方法有两种
第一种
@rank =1; @rank:=1
第二种
select num into @rank from goods where id=“1”
实现业务功能的点就在于
IF (
@tmp = goodsTypeCode ,@rank :=@rank + 1,@rank := 1
) AS new_rank
如果 @tmp 等于goodsTypeCode,@rank则自增 否则@rank为1