SQL之奇技淫巧-错行合并选择数据

今天,接到了这样一个需求,有这样一张表:

要求,做到下面这样的效果:

表结构及示例数据如下:

CREATE TABLE `merchant_vip` (
   `id_merchant_vip` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
   `name` VARCHAR(50) NOT NULL COMMENT '会员名称',
   `money` INT(11) NOT NULL COMMENT '消费达标门槛',
   PRIMARY KEY (`id_merchant_vip`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='等级表';

insert into `merchant_vip` (`id_merchant_vip`, `name`, `money`) values('7','新手','0');
insert into `merchant_vip` (`id_merchant_vip`, `name`, `money`) values('8','普通','200');
insert into `merchant_vip` (`id_merchant_vip`, `name`, `money`) values('9','银卡','500');
insert into `merchant_vip` (`id_merchant_vip`, `name`, `money`) values('10','金卡','1000');
insert into `merchant_vip` (`id_merchant_vip`, `name`, `money`) values('11','白金','3000');
insert into `merchant_vip` (`id_merchant_vip`, `name`, `money`) values('12','钻石','10000');

 

本来想用行转列的方式去做,结果发现行不通,只好另想办法,写了sql:

SELECT
	a.id_merchant_vip,
	a. NAME,
	a.money,
	b.money AS money_max
FROM
	(
		SELECT
			@rownum :=@rownum + 1 AS rn1,
			t.*
		FROM
			(SELECT @rownum := 0) r,
			merchant_vip t
	) a
LEFT JOIN (
	SELECT
		@rownums :=@rownums + 1 AS rn2,
		t.*
	FROM
		(SELECT @rownums := 0) r,
		merchant_vip t
	WHERE
		money > 0
	ORDER BY
		money
) b ON a.rn1 = b.rn2;

SELECT
	*
FROM
	merchant_vip;

嗯,思路就是先按money字段排序,然后使用rownum变量存储数据编号,过滤掉第一条记录,

然后错行进行2张表的左连接,拼装好数据。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值