前一段時間的工作中有一項是計算實時統計結果并生成相應的資料表(主要是算産品PV,UV的環比什麼的)。 所謂實時統計,就是終端請求Server接口時把相應資料寫進日志,然後使用Python分析日志程式,将各統計項整理成各自的檔案。再将這些整理好的檔案定時發送到解析檔案接口中解析并入庫。最後寫SQL計算統計結果。 順便提一句,我們用的是MySQL,單庫千萬量級以下的資料都沒問題。例如每天往表裡寫2w資料,則10000000/20000 = 500天内不需要優化。 回到正題,下面是這個SQL中使用到的一些技巧(SQL實在太長就不貼了): 1.select子句中的條件查詢: (CASE WHEN sd.type=1 THEN (select a.title from db1.apk a where a.id=sd.materialId) WHEN sd.type=2 THEN (select d.title from db1.ad d where d.id=sd.materialId) WHEN sd.type=3 THEN (select w.title from db1.wallpaper w where w.id=sd.materialId) END) as title, 原來也知道在SQL中可以寫條件查詢,但是沒用過,這次用了一下,就是CASE...WHEN...THEN...[ELSE] ...END... 2.多庫join查詢: 說實話,這個原來确實沒聽說過(不知道其它資料庫如Oracle什麼的是不是也有這個功能).上網查了一下才發現的,自己試一試果然沒問題。所謂多庫join就是不同資料庫中的表進行關聯查詢。 解決方法:在MySQL中其實很簡單,就是查詢時在表名前加上資料庫名就行啦:) 例如上面的sql語句,db1是一個庫中的表,将其查詢結果作為db2表中的查詢列(當然做join等操作也是沒問題的)。 3.相關子查詢: SELECT sd.statTime,sd.type,sd.materialId,sd.pv,sd.token, (select SUM(totalpvtab.pv) from statdetail totalpvtab where totalpvtab.statTime=sd.statTime and totalpvtab.materialId=sd.materialId and totalpvtab.type=sd.type) totalpv, FROM .... 就是将外層查詢的列作為子查詢的查詢條件了。 4.SQL函數: 還用到一些SQL函數如: DATEDIFF(sd.statTime,a.createdTime) -- 計算兩個日期天數差, ABS(X) -- 取X絕對值, 等等。 先寫到這裡吧,明天繼續。