1:用變數排名
例: 以ecshop中的商品表為例,計算每個欄目下的商品數,並按商品數排名.
select cat_id,count(*) as cnt from goods group by cat_id order by cnt desc;
並按商品數計算這些欄目的名次
set @curr_cnt := 0,@prev_cnt := 0, @rank := 0;
select cat_id, (@curr_cnt := cnt) as cnt,
(@rank := if(@curr_cnt <> @prev_cnt,@rank+1,@rank)) as rank,
@prev_cnt := @curr_cnt
from ( select cat_id,count(*) as cnt from shop. goods group by shop. goods.cat_id order by cnt desc) as tmp;
2:用變數計算真正影響的行數
當插入多條,當主鍵重複時,則自動更新,這種效果,可以用insert on duplication for update
要統計真正」新增」的條目, 如下圖,我們想得到的值是」1」,即被更新的行數.
總影響行數-2*實際update數, 即新增的行數.
3: 簡化union
比如有新聞表,news , news_hot,
new_hot是一張記憶體表,非常快,用來今天的熱門新聞.
首頁取新聞時,邏輯是這樣的:
先取hot, 沒有 再取news,為了省事,用乙個union來完成.
如何利用變數讓後半句select不執行 ,
select id,content,(@find := 1) from news_hot where id=1 //第乙個sql語句會先執行where後面的語句,如果在new_hot找到id=1的記錄,就定義@find變數為1,那麼
//下面的union的子句where id=1 and (@find <= 0)不成立,就不會去查詢news表的內容
union
select id,content,(@find :=1) from news where id=1 and (@find <= 0)
union 1,1,1 where (@find :=null) is not null;//這裡是重新初始化@find變數
3:小心變數的順序
如下圖:變數先在where中發揮作用,然後再是select操作.
如果where不成立,select操作再不發生.
第2例:
在這個例子中, 1,2兩行,先排好序, 在記憶體中,就是這樣的順序 [2] [1]
再逐行where條件判斷,取值.
對比這2張圖,分析:
1: where先發揮作用,把需要的行 都給找出
2: 然後再逐行 select
因此, 前者, 最終select時,select@num變數,都是乙個值
後者,不斷select,不斷修改@num的值, 值不斷變化.
同時: 使用變數,將會使sql語句的結果不快取.
C ref,out變數巧用篇
c ref,out變數巧用篇 輸入輸出變數 todo 1,ref型別變數運用 2,out型別變數運用 講解篇 1,ref型別變數 string strref getchangeref ref strref 呼叫 strref變數的值已經改變過了。getchangeref ref string str...
ruby on rails 減少查詢次數
有時間寫 比較粗糙,不管 質量,這樣會造成查詢次數過多的情況 下面幾個方法可盡量避免 1 使用includes 方法及早載入 active record 允許我們提前指明需要載入的所有關聯,這是通過在呼叫model.find時指明includes方法實現的。通過指明includes方法,active...
bash中變數的巧用
鳥哥的私房菜 可以用乙個變數來代替長串的目錄,這樣即好記,也提高了效率。引用如下 若你有乙個常去的工作目錄名稱為 cluster server work taiwan 2005 003 如何 進行該目錄的簡化?答 在一般的情況下,如果你想要進入上述該目錄得要 cd cluster server wo...