MySQL 還能夠這樣作

多個字段惟一性如何處理?

  • 情景
有張表,表裏有多個字段須要惟一,不能重複,不然就是重複數據,插不進去
  • 傳統作法
直接給多個字段直接加惟一索引,簡單粗暴
  • 如今作法
新增一個字段,這個字段加惟一索引,這樣能夠不用加過多惟一索引
insert into news(new_title, new_abstr, new_code) 
values('你是好','我是誰',MD5(CONCAT('你是好','我是誰')))

數據存在,就更新,不存在,就插入如何處理?

  • 情景
有張表,裏面的記錄不能存在重複記錄,記錄存在就更新,若是不存在就插入
  • 傳統作法
先查詢select,若是存在就update,不存在就insert
  • 如今作法
mysql專門有種寫法, on DUPLICATE key Update
insert into news(new_title, new_abstr, new_code, update_time, create_time) 
values('你是好','我是誰',MD5(CONCAT('你是好','我是誰')))
on DUPLICATE key Update
update_time=now(), create_time=now()

查詢結果的行號如何實現?

  • 情景
爲某些功能的實現 墊定基礎
  • 作法
select name,age,sex,@rownum:=@rownum+1 as row_num 
from tb_student a,(select @rownum:=0) b 
order by age asc;

組內排序,並每組取出最高點擊量的2個數據

  • 情景
常常會遇到2種狀況
一、先按班級分組,並對各班學生按成績由高到低排序(分組,並組內排序)
二、在第一種情形下,再取出每班成績前10名
  • 作法
分組,並組內排序:
select name,class_name,score 
from tb_student order by class_name,score desc

取出每班成績前10名:
SELECT w.name,w.score,w.row_num 
FROM
(
    SELECT g.name,g.score,IF(@bak=g.name,@row_num:=@row_num+1,@row_num:=1) AS row_num,@bak:=g.name 
    FROM
    (SELECT * 
    FROM course AS c,(SELECT @row_num:=0,@bak:='') AS b 
    ORDER BY c.`name`,c.score DESC
    ) AS g 
) as w 
WHERE w.row_num < 11

簽到,並獲取連續簽到的用戶列表

  • 情景
一、簽到(同一天只能簽到一次)
二、獲取連續簽到X天的用戶列表
  • 傳統作法
先查詢,後更新(要使用到程序,2條SQl)
SELECT * FROM student_sign_log WHERE id = 7 AND sign_date = '2018-3-24'
update student set sign=sign+1
update student set sign=1
  • 如今作法
一、簽到
UPDATE student 
SET sign_num = 
CASE
    WHEN sign_date < '2018-3-23' THEN 1
    WHEN sign_date = '2018-3-23' THEN sign_num+1
END,
sign_date = '2018-3-24'
WHERE id=7 AND sign_date < '2018-3-24'

二、獲取連續簽到X天的用戶列表
SELECT w.name,w.score,w.row_num,w.sign_date
FROM
(
    SELECT g.name,g.score,IF(@bak=g.name and datediff(g.sign_date,@pre_date)=1,@row_num:=@row_num+1,@row_num:=1) AS row_num,@bak:=g.name,@pre_date:=g.sign_date
    FROM
    (SELECT * 
    FROM course AS c,(SELECT @row_num:=0,@bak:='',@pre_date:='') AS b 
    ORDER BY c.`name`,c.score DESC
    ) AS g 
) as w 
WHERE w.row_num < 11

根據商品分類,來獲取最新日期的商品銷售狀況

  • 情景
一、獲取每一個商品分類的最新銷售日期
二、根據上面查詢的日期再次查詢出最新商品銷售狀況
  • 作法
select a.* from pro_sale as a inner join
(select pro_class,max(sale_date) as sale_date from pro_sale group by pro_class) as b
on a.pro_class = b.pro_class AND a.sale_date = b.sale_date order by pro_class

商品按銷量排序,並要把指定幾個商品頂置最前面(排序做弊)

  • 情景
常常會遇到按條件排序以外還要把指定商品頂置,此時該如何處理呢?
  • 傳統作法
(select * from product where id in (4,2,8) order by user_total desc)
union
(select * from product where id not in (4,2,8) order by user_total desc)
  • 如今作法
select * from product order by id in (4,2,8) desc,user_total desc

分組,如何統計組內數據名稱?

  • 情景
獲取全部分類下的全部商品名稱統計
  • 作法
select GROUP_CONCAT(pro_name),pro_type from product group by pro_type
相關文章
相關標籤/搜索