MySQL 反向查询使用

2017-01-06 10:08:54来源:oschina作者:泥瓦匠工人人点击



### 业务场景
* 产品需求:APP根据不同的渠道,显示不同的菜单
* 功能设计:
* 根据渠道,版本不一样获取不同菜单名称
* 渠道和版本分别为精确和模糊匹配,故出现四种匹配方式,顺序要求
1. 渠道精确,版本精确
2. 渠道精确,版本模糊
3. 渠道模糊,版本精确
4. 渠道模糊,版本模糊
* 数据表设计,示例表menu, 去掉无关字段
```sql
create table menu(name varchar(100),type varchar(100), ver varchar(100),no int(11));
```
* 插入数据时,根据type是否精确配置和版本是否精确配置,设置顺序为1,2,3,4
```sql
insert into menu(name, type, ver, no) values('菜单1','abcd','qwef',1);
insert into menu(name, type, ver, no) values('菜单2','abcd','qw%',2);
insert into menu(name, type, ver, no) values('菜单3','ab%','qwef',3);
insert into menu(name, type, ver, no) values('菜单4','ab%','qw%',4);
```
* 根据要求正常的查询操作顺序如下,比如 type为abcd,ver为qwef,最坏情况下进行四次查询
```sql
* select * from menu where type = 'abcd' and ver = 'qwef'; -- 如果查询到,返回
* select * from menu where type = 'abcd' and ver like 'qw%'; -- 如果查询到,返回
* select * from menu where type like 'ab%' and ver = 'qwef'; -- 如果查询到,返回
* select * from menu where type like 'ab%' and ver like 'qw%'; -- 如果查询到,返回
```
也是可以完成业务查询,只是可能要查询的次数比较多
* MySQL数据提供反向查询功能,只需要查询一次即可,如下
```sql
select * from menu where 'abcd' like type and 'qwef' like ver order by no limit 1;
```

### 结论
在进行业务功能设计时,尽可能多种方案进行对比,找出做好的一种,这样的好处是功能完成,代码简洁,维护方便
当然,最重要是要在规定的时间内把功能完成为第一要素。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台