多個字段惟一性如何處理?
有張表,表裏有多個字段須要惟一,不能重複,不然就是重複數據,插不進去
直接給多個字段直接加惟一索引,簡單粗暴
新增一個字段,這個字段加惟一索引,這樣能夠不用加過多惟一索引
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