單純的記錄乙個 sql 語句的修改過程。
運營後台需要對使用者金幣變動資訊按照時間段(以天為最小單位)統計查詢。
id(記錄資料唯一標識,主鍵,account(使用者登入唯一標識)
cost(單日金幣變動彙總)
type(變動型別,收入和支出)
vip(記錄當前的 vip 等級)
date(當天變動的最新時間)
乙個使用者一天最多兩條記錄彙總,乙個收入乙個支出,資料是現成。第乙個版本
select id,account,cost,type,vip,date from *** where ***(具體時間條件)
最原始的版本就出來,當然where後面的語句耗費了大量的時間構建。時間條件是核心,要滿足運營的查詢需求,這裡不做過多描述,根據各自業務需求來確定。
重新理解需求
發布測試版本,產品很快找到我說效果不對,重新給我仔細講解了一遍新的需求。
是對一段時間內使用者金幣變更記錄彙總,即乙個使用者(account)只能出現一次,對該使用者這個時間段內的所有 cost 按照查詢條件(時間和變動型別 type)彙總。第二個版本
select id,account,sum(cost) as cost,vip,date from *** where *** group by account
測試版本發布,測試說:「vip 等級不對。」彙總記錄的 vip 等級不是最新的 vip 等級。做過的應該都知道,這種日誌記錄一般都是記錄當時的使用者狀態,後續新增記錄也不會修改以前的記錄狀態。
經過和產品認(鬥)真(智)溝(鬥)通(勇),最後妥協的方案就是 vip 等級顯示為查詢時間段內的最新等級。舉個例子:2018.1.1-2018.2.28,顯示就是時間段內最新記錄的 vip 等級,28 號有就顯示 28號,27 號有就顯示 27 號(因為業務原因,不能從 vip 等級表裡面查詢最新的等級)。
最終版本
網上一搜,發現 last() 這麼乙個函式,可以直接獲取最新的記錄。
select id,account,sum(cost) as cost,last(vip),date from *** where *** group by account
毫無疑問的報錯了,因為 mysql 不支援這個函式。經過大量搜尋後,發現對此都沒有很好的解決方案,大部分都不適用我當前的業務場景。曾經一度想在業務層進行聚合,但是複雜的業務使我放棄這個更加不靠譜的決定。
最終找到了這麼一篇文章「first() and last() in mysql」,裡面的思路給我我很大的啟發。
select id,account,sum(cost) as cost,vip,max(date) as date from *** where *** group by account
這就是最終版本的 sql 語句,算是一種取巧手段,其實這裡使用max(id)更加合適。
回顧總結
作為乙個合格的開發人員,應該正確的理解需求,遇見需求不明確的時候,應該多和產品溝通,確保自己所做的和目標需求一致。自己 sql 基礎薄弱,這方面需要多多彌補。
寫到最後,發現這次文章寫偏了,本來應該是講這個 sql 實現如何困難,結果變成了需求溝通不一致。
記一次sql查詢
效果圖 要查詢出如上圖的效果 知識點.1.多表巢狀查詢.2.輸出查詢結果,group concat函式 3.關聯查詢 select t1.學校,case when t1.年級 2017 then 1年級 when t1.年級 2016 then 2年級 when t1.年級 2015 then 3年...
記一次複雜查詢
專案中有乙個需求,查出使用者取出,充值次數,金額,使用者名稱,金幣的總量和每局遊戲的盈虧等做乙個統計,而他們分布在個表中,分別是使用者表,使用者取出表,使用者充值表,每局遊戲表中。首先想到的就是要分組查詢,group by user.userid.因為有的使用者有充值記錄但不一定有取出記錄,所以需要...
mysql安裝一次 記一次mysql安裝
mysql 分為安裝版和壓縮版 2.安裝 2.1 解壓得到 mysql 8.0.15 winx64 資料夾 2.2 在mysql 8.0.15 winx64 資料夾下,新建配置檔案my.ini,內容 如下 mysqld 設定3306埠 port 3306 設定mysql的安裝目錄,這裡是唯一你需要改...