mysql高级排序&高级匹配查询示例

  在大多数应用场景下,咱们使用mysql进行查询时只会用到'=', '>' , '<' , in, like 等经常使用的方法,看起来,大多数状况下,已经足以应付咱们的小型应用了。不过,在一些特殊场景,则须要特殊的查询方式了。mysql

  1. 根据状态来排序的查询git

    假设如今一个记录有四种状态,未处理(0)、正在处理(2)、处理成功(1)、处理失败(4),之因此他们的值是这个样子,是由于咱们通常状况下是不会用它去排序,因此天然的就想到这样的一些值赋予意义。可是,在排序的时候怎么处理呢? 假如要求的前后顺序是这样的:未处理>处理失败>正在处理>处理成功, 我能想到的就是,假设它们这些状态就是按照要求的排序的值去依次增长的,那就只须要一个order by 该字段便可。具体实现以下:sql

select * from tab_task b order by (CASE b.deal_status WHEN 0 THEN 10 WHEN 2 THEN 30 WHEN 1 THEN 40 WHEN 4 THEN 20  ELSE 40 END) ASC,b.add_time desc     //按照所需排序值,依次赋值

若是是要根据某个计算的值来排序,如按平均成绩排序,则实现以下:ui

SELECT * FROM score b GROUP BY uid ORDER BY AVG(b.`score`) DESC;    //直接计算得出排序值,使用RAND()能够获得随机的排序

  2. 比较复杂的模糊查询spa

    有时,咱们须要从某字段中筛选符合条件的值,可是该值又不是一个独立的字段,这时就须要一些高级的模糊查询(正则)。code

如,须要查询某个值大于0的记录,实现以下:blog

SELECT * FROM tab_day_data WHERE retention_days_full REGEXP '.*rd1=([0][1-9]+|[1-9][0-9]*).*';      //查询rd{x}大于0的记录,其中rd多是许多个相似的不重要的值,被储存至一个字段,同理于其余

mysql正则语法,以下:排序

// .  表示匹配任意一个字符
// | 做为OR操做符,表示匹配其中之一
// [ ] 匹配任何单一字符
// [:a;num:]    任意字母和数字(同 [a-zA-Z0-9]// [:alpha:]     任意字符(同 [a-zA-Z]// [:blank:]     空格和制表(同 [\\t]// [:cntrl:]        ASCII控制字符(ASCII 0到31和127)
// [:digit:]       任意数字(同[0-9]// [:graph:]["print:] 相同,但不包括空格
// [:lower:]      任意小写字线(同 [a-z]// [:print:]        任意可打印字符
// [:punct:]      既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符
// [space:]       包括空格在内的任意空白字符(同 [\\f\\n\\t\\r\\v]// [:upper:]     任意大小字母(同 [A-Z]// [:xdigit:]      任意十六进制数字(同 [a-fA-F0-9]// 元字符  .*?+{m}{m,}{m, n}

  语法与正宗的正则不太一致,但大致原理是一致的。进程

  用mysql作复杂的匹配,虽然能够实现,可是相对来讲效率低下,最好仍是使用独立字段的形式进行查询,用空间换取时间!事务

 

3. 检查校验和,验证表是否相等

数据在传输时,可能会发生变化,也有可能由于其它缘由损坏,为了保证数据的一致,咱们能够计算checksum(校验值)。

使用MyISAM引擎的表会把checksum存储起来,称为live checksum,当数据发生变化时,checksum会相应变化。

CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED]

  附:mysql进程查看,卡死现象的解决办法

SHOW FULL PROCESSLIST;       # 查看全部的进程状况,具体解决请百度

SHOW STATUS;              # 查看整体运行概况

KILL 213;          # 将运行慢或卡死的进程删除,注意数据的事务性,不然可能致使数据错误

 

  

  问? 

  mysql 分表以后(好比按年分表,多个相关联表同步拆分),查询应该怎样作才好? 

相关文章
相关标签/搜索