mysql做前端_MySQL 还可以这样做
多個(gè)字段唯一性如何處理?
情景
有張表,表里有多個(gè)字段需要唯一,不能重復(fù),否則就是重復(fù)數(shù)據(jù),插不進(jìn)去
傳統(tǒng)做法
直接給多個(gè)字段直接加唯一索引,簡(jiǎn)單粗暴
現(xiàn)在做法
新增一個(gè)字段,這個(gè)字段加唯一索引,這樣可以不用加過(guò)多唯一索引
insert into news(new_title, new_abstr, new_code)
values('你是好','我是誰(shuí)',MD5(CONCAT('你是好','我是誰(shuí)')))
數(shù)據(jù)存在,就更新,不存在,就插入如何處理?
情景
有張表,里面的記錄不能存在重復(fù)記錄,記錄存在就更新,如果不存在就插入
傳統(tǒng)做法
先查詢select,如果存在就update,不存在就insert
現(xiàn)在做法
mysql專(zhuān)門(mén)有種寫(xiě)法,
on DUPLICATE key Update
insert into news(new_title, new_abstr, new_code, update_time, create_time)
values('你是好','我是誰(shuí)',MD5(CONCAT('你是好','我是誰(shuí)')))
on DUPLICATE key Update
update_time=now(), create_time=now()
查詢結(jié)果的行號(hào)如何實(shí)現(xiàn)?
情景
為某些功能的實(shí)現(xiàn)
墊定基礎(chǔ)
做法
select name,age,sex,@rownum:=@rownum+1 as row_num
from tb_student a,(select @rownum:=0) b
order by age asc;
組內(nèi)排序,并每組取出最高點(diǎn)擊量的2個(gè)數(shù)據(jù)
情景
經(jīng)常會(huì)遇到2種情況
1、先按班級(jí)分組,并對(duì)各班學(xué)生按成績(jī)由高到低排序(分組,并組內(nèi)排序)
2、在第一種情形下,再取出每班成績(jī)前10名
做法
分組,并組內(nèi)排序:
select name,class_name,score
from tb_student order by class_name,score desc
取出每班成績(jī)前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ù)簽到的用戶列表
情景
1、簽到(同一天只能簽到一次)
2、獲取連續(xù)簽到X天的用戶列表
傳統(tǒng)做法
先查詢,后更新(要使用到程序,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
現(xiàn)在做法
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'
2、獲取連續(xù)簽到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
根據(jù)商品分類(lèi),來(lái)獲取最新日期的商品銷(xiāo)售情況
情景
1、獲取每個(gè)商品分類(lèi)的最新銷(xiāo)售日期
2、根據(jù)上面查詢的日期再次查詢出最新商品銷(xiāo)售情況
做法
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
商品按銷(xiāo)量排序,并要把指定幾個(gè)商品頂置最前面(排序作弊)
情景
經(jīng)常會(huì)遇到按條件排序之外還要把指定商品頂置,此時(shí)該如何處理呢?
傳統(tǒng)做法
(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)
現(xiàn)在做法
select * from product order by id in (4,2,8) desc,user_total desc
分組,如何統(tǒng)計(jì)組內(nèi)數(shù)據(jù)名稱?
情景
獲取所有分類(lèi)下的所有商品名稱統(tǒng)計(jì)
做法
select GROUP_CONCAT(pro_name),pro_type from product group by pro_type
總結(jié)
以上是生活随笔為你收集整理的mysql做前端_MySQL 还可以这样做的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python按位定义数据_《Python
- 下一篇: mysql安装教程刘猿猿_mysql安装