怎么對網(wǎng)站鏈接做拆解什么軟件可以找客戶資源
? ? ? ? 對mysql 查詢實戰(zhàn)-變量方式-題目,進行一個解答。(先看題,先做,再看解答)
1、查詢表中?少連續(xù)三次的數(shù)字
1,處理思路
????????要計算連續(xù)出現(xiàn)的數(shù)字,加個前置變量,記錄上一個的值,跟當前值做比較,如果相同,則進行累加
SELECT *, @count:=IF(@pre=number,@count+1,1) AS count_num,@pre:=number AS pre
FROM numbers,(SELECT@count:=0, @pre:=NULL) v;
????????統(tǒng)計count_num大于3的數(shù)字就好了。
2,進行統(tǒng)計
SELECT DISTINCT number FROM(
SELECT *,@count:=IF(@pre=number,@count+1,1) AS COUNT,@pre:=number AS pre FROM
numbers, (SELECT @count:=0,@pre:=NULL) v
) AS tmp WHERE tmp.count >= 3;
2、查詢銷售額較昨?上升的記錄
1,處理思路
????????要比較昨日上升的,要加個變量,記錄昨天的值。用今天的值,跟昨天的值,做一個比較,并做一個標記。
-- 根據(jù)時間排序,現(xiàn)在的值(amount),比昨天的值(@pre)大的 flag設置為為1,否則為0
select *, @flag:=if(ammount>@pre,1,0) as flag,
@pre:=ammount as pre
from (select @flag:=0,@pre:=null) as v, sale order by record_date;
? ? ? ? 再過來flag=1的數(shù)據(jù)
2,進行過濾統(tǒng)計
select id,record_date,ammount from ( select *,@flag:=if(ammount>@pre,1,0) as flag,@pre:=ammount as pre from (select @flag:=0,@pre:=null) as v, sale order by record_date ) as tmp where flag=1
3、查詢投票結果的排名情況
????????即第一名、第二名是誰,或者理解為,按倒序排好后,加個序號(區(qū)別就是同值的,排名是一樣的)。
1,處理思路
????????排名,也是要跟前一個值做比較,值一樣,排名不變;更小,就加1
-- 與前面一行進行比較,值一樣,排名不變;更小,就加1
select name,votes,ranking from(
select *,@ranking:=if(votes=@pre,@ranking,@ranking+1) as ranking,
@pre:=votes as pre
from (select @ranking:=0,@pre:=null
) as v,vote order by votes desc
) as tmp;
????????這個排名看起來好奇怪,不符合實際的。兩個第二名,下一個就是第四名了。
????????需要再做一次調(diào)整,比如兩個第一后,累加的值就變成2了。因此需要再聲明一個變量,用于判斷累加的次數(shù)。
2,實際情況
-- 先累加相同的值, 然后把值賦值給另外一個變量。 再進行二次判斷,如果sumSame的值大于0,就用sumSame。
SELECT *, @same:=IF(votes=@pre, @same+1,0) AS same, @ranking:=IF(votes=@pre, @ranking,
@ranking+1+IF(@sumSame > 0, @sumSame,0)) AS ranking,@pre:=votes AS pre, @sumSame:=@same AS sunSame
FROM (SELECT @ranking:=0,@same:=0,@pre:=NULL,@sumSame:=NULL
) AS v,vote ORDER BY votes DESC;
3,進行提取
SELECT id, NAME, votes, ranking FROM (
SELECT *, @same:=IF(votes=@pre, @same+1,0) AS same, @ranking:=IF(votes=@pre, @ranking, @ranking+1+IF(@sumSame > 0, @sumSame,0)) AS ranking,@pre:=votes AS pre, @sumSame:=@same AS sunSame
FROM (SELECT @ranking:=0,@same:=0,@pre:=NULL,@sumSame:=NULL
) AS v,vote ORDER BY votes DESC
) AS temp;
????????這樣就符合實際的情況
4、查詢?站訪問?峰期
????????目標: 查詢網(wǎng)站訪問高峰時期,高峰時期定義:至少連續(xù)三天訪問量>=1000
1,先統(tǒng)計訪問量大于1000
select *,@count:=if(visit_sum>=1000,@count+1,0) as count
from visit_summary;
2,用倒序排列,統(tǒng)計數(shù)量大于3的
再聲明一個變量,用于記錄上一條flag值
--連續(xù) 用倒序排列, 再聲明一個變量,用于記錄上一條flag值。SELECT *, @pre:=@flag, @flag:=IF((count_num>=3) AND count_num>0,1,0) AS flag
FROM(
SELECT *, @count:=IF(visit_sum>=1000, @count+1,0) AS count_num
FROM visit_summary
) AS tmp1 ORDER BY id DESC;
????????由結果可以看出,對于小于3的,判斷前面一條的flag是否為1,即@pre的值為1
3,對于小于3的,判斷前面一條的flag是否為1
-- 小于3的,判斷前面一條的flag是否為1。
SELECT *, @pre:=@flag,
@flag:=IF((count_num>=3 OR @pre=1) AND count_num>0,1,0) AS flag
FROM(
SELECT *,@count:=IF(visit_sum>=1000,@count+1,0) AS count_numFROM visit_summary
) AS tmp ORDER BY id DESC;
? ? ? ? 然后再過濾flag值為1的,是符合要求的。
4,進行過濾
select * from(
select *,@flag:=if((count>=3 or @flag=1) and count>0,1,0) as flag
from(select *,@count:=if(visit_sum>=1000,@count+1,0) as count from visit_summary
) as tmp order by id desc
) as tmp where tmp.flag=1 order by tmp.id;
總結:
????????上面這些題目,都有進行比較的特點,連續(xù)出現(xiàn)多少次,或者跟昨天比有上升,還是排名的情況,都要進行比較,尤其是連續(xù)出現(xiàn)多次,排名這種情況,用變量寫反而比直接寫sql要方便很多。后續(xù)有出現(xiàn)要比較的情況,就可以考慮用變量的方式去處理,多嘗試!!!
????????
? ? ? ? 上一篇: 《mysql 查詢實戰(zhàn)-變量方式-題目》
? ? ? ? 下一篇: 《mysql 查詢實戰(zhàn)1-題目》