http://www.dewen.net.cn/q/15720/这样的情况一个sql语句怎么写

这样的情况一个sql语句怎么写?

 

表messages中有mcnos字段(用户卡号,长度16),这个字段当初成设计成mediutext类型,绝大部分都是一个卡号,即长度为16位,但是也有一小部分长度为许多卡号拼凑的,大于16位。现在使用 like '%mcno%'这样的语句效率很低,我想让长度大于16为的用 like '%mcno%'匹配,长度等于16位的直接 ='mcno',请问,这样的情况一个sql可以完成吗?

 
 
 
评论 ( 0) •  举报 (0) •   •  链接 • 2013-12-10 
 
添加评论...
1个答案

 

可以的. 参考 高性能mysql, Writing a lazy UNION 这一节, 给出sql如下:

  1.   SELECT GREATEST(@found := -1, id) AS id
  2.     FROM messages WHERE card_no = 'xxxxxxxxxxx'
  3. UNION ALL
  4.   SELECT id
  5.     FROM messages WHERE card_no like '%xxxxxxxxxxx%' AND @found IS NULL
  6. UNION ALL
  7.   SELECT 1 FROM DUAL WHERE ( @found := NULL ) IS NOT NULL;
 

解释一下:
第一个select:
"SELECT GREATEST(@found := -1, id) AS id FROM messages where id ='xxx'" 
--如果where 没有找到记录, 则select里 greatest函数不会被执行, 所以变量 @found为NULL; 如果where找到记录, 则select里 greatest函数 执行, 变量 @found被赋值为-1. 因为id都是正整数, 所以GREATEST(@found := -1, id)的值肯定是id;

第二个select:
-- @found为NULL则 此select不会执行, mysql引擎也不会去做 card_no like '%xxxxxxxxxxx%' 操作;

第三个select:
-- 重置@found变量.

首先用 '=' 方式做匹配, 好处是可以用到索引; 匹配不到再 'like' 操作. 因为'绝大部分都是一个卡号,即长度为16位', 所以性能还可以.

性能考虑

当然这里 like 需要走整个messages表, 而且不能索引. 所以还是很慢, 可以考虑更新一下表结构:

  1. 把卡号信息单独拿出来作为子表, 主表里只放卡号子表的id;
  2. '一个卡号,即长度为16位' 放在一张表里;
  3. '一小部分长度为许多卡号拼凑的,大于16位。'的数据 放在另一个表里.
 

这就很类似 <<高性能mysql>>, Writing a lazy UNION 这一节 给出的那个sql了, 分别从'users' 和'users_archived'两张表里查询 用户信息. 可以仔细揣摩一下.

PS: 没必要用mediumtext类型.

转载于:https://www.cnblogs.com/brayden/p/5262062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是参考代码: ```python import requests # 登录阿里云账号 session = requests.Session() login_url = "https://account.aliyun.com/login/login.htm" data = { "resource_url": "", "from_site": "account", "callback": "https://account.aliyun.com/login/login_return.htm", "aliyun_uuid": "", "csrf_token": "", "username": "<你的阿里云账号>", "password": "<你的阿里云密码>", "submit_mode": "password", "lang": "zh_cn", "ua": "20161229024035554", "umid_token": "AXQ6U150a6d0a8c98f959e1d6b1754dd4e4de4c32", "loginScene": "ecommerceServiceLogin", "gAT": "", "errorCode": "", "loginType": "smsLogin", "regionId": "cn-hangzhou", "vk": "", "pk": "", "policy": "", "asftware": "", "src": "", "tf": "" } headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36" } response = session.post(login_url, headers=headers, data=data) response.raise_for_status() # 下载文件 download_url = "<下载文件的链接>" response = session.get(download_url, headers=headers) response.raise_for_status() # 保存文件 with open("<保存路径>", "wb") as f: f.write(response.content) ``` 需要替换代码中的以下内容: - `<你的阿里云账号>`:将其替换为你的阿里云账号; - `<你的阿里云密码>`:将其替换为你的阿里云密码; - `<下载文件的链接>`:将其替换为你需要下载的文件的链接; - `<保存路径>`:将其替换为你需要保存文件的路径。 注意:以上代码仅供参考,实际使用时需要根据具体情况进行调整。在使用之前,需要确保安装了 requests 库。你可以使用以下命令来安装 requests: ``` pip install requests ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值