mysql-奇技淫巧之附属表过滤查询数量

mysql-奇技淫巧

最近参加公司新项目,其中mysql中的一些奇技淫巧吸引了我,利用inner join 表内连接筛选出规定的数据量,话不多说看代码!

创建表 test_1

CREATE TABLE test_1 (
id int(11) NOT NULL,
name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
salary_data varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

插入一些数据

INSERT INTO test_1 (nick_name, salary_data)
VALUES(
‘小明’,‘1000;2000;3000;4000;5000’
);
INSERT INTO test_1 (nick_name, salary_data)
VALUES(
‘小红’,‘1001;2001;3001’
);
INSERT INTO test_1 (nick_name, salary_data)
VALUES(
‘小张’,‘0011’
);
在这里插入图片描述

注意不要向下边这样,差距在最后一位多一个‘ ; ’ 最好复制上边的SQL
在这里插入图片描述

创建一个筛量表 new_table

CREATE TABLE new_table (
id int(11) NOT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

给new_table表插入3个id

在这里插入图片描述
like this
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

接下来就可以开始我们的语句了。

SELECT t.id as test_id,t.nick_name as nick_name,SUBSTRING_INDEX( SUBSTRING_INDEX( t.salary_data, ';', new_table.id + 1 ), ";",- 1 ) AS salary_data,new_table.id AS table_id FROM test_1 AS t INNER JOIN new_table ON new_table.id < ( LENGTH( t.salary_data ) - LENGTH( REPLACE ( t.salary_data, ";", "" ) ) + 1 );

这样我们就成功的过滤掉超过2条的薪资数据(小明的薪资4000;5000),用inner join on筛选掉了那两条数据,后来我想如果换成3不是不用这么费劲了吗?结果实践果然是检验真理的唯一标准;
在这里插入图片描述
new_table.id 替换成3后,不能匹配其他人的数据。具体原理仍在探索中,现猜测可能是mysql在select时,如果配到数字类型则比较一回就结束了查询吧。当然朋友们如果知道具体原因,麻烦留言告知答案,感激不尽。

这是一个小小的奇技淫巧,一则总结,二则分享,希望看到这里的人没有浪费你的时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值