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 分表以後(好比按年分表,多個相關聯表同步拆分),查詢應該怎樣作纔好? 

相關文章
相關標籤/搜索