亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在MySQL中計算運行總數

在MySQL中計算運行總數

牧羊人nacy 2019-06-16 14:39:40
在MySQL中計算運行總數我有一個MySQL查詢:SELECT DAYOFYEAR(`date`)  AS d, COUNT(*) FROM  `orders` WHERE  `hasPaid` > 0GROUP  BY dORDER  BY d返回如下內容:d  | COUNT(*) |20 |  5       |21 |  7       |22 | 12       |23 |  4       |我真正想要的是在結尾的另一篇專欄文章,以顯示正在運行的總數:d  | COUNT(*) | ??? |20 |  5       |   5 |21 |  7       |  12 |22 | 12       |  24 |23 |  4       |  28 |這個是可能的嗎?
查看完整描述

3 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

對于您來說,這可能是一個更簡單的解決方案,可以防止數據庫執行大量的查詢。它只執行一個查詢,然后在一次傳遞中對結果做一些計算。

SET @runtot:=0;SELECT
   q1.d,
   q1.c,
   (@runtot := @runtot + q1.c) AS rtFROM
   (SELECT
       DAYOFYEAR(`date`) AS d,
       COUNT(*) AS c    FROM  `orders`
    WHERE  `hasPaid` > 0
    GROUP  BY d    ORDER  BY d) AS q1

這將為您提供一個額外的RT(運行總計)列。不要錯過頂部的set語句,以便首先初始化正在運行的ALUL變量,否則只會得到NULL值的列。


查看完整回答
反對 回復 2019-06-16
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

SELECT 
   DAYOFYEAR(O.`date`)  AS d, 
   COUNT(*),
   (select count(*) from `orders` 
       where  DAYOFYEAR(`date`) <= d and   `hasPaid` > 0)FROM  
  `orders` as OWHERE  
  O.`hasPaid` > 0GROUP  BY dORDER  BY d

這將需要一些語法調優(我沒有MySQL來測試它),但它向您展示了這個想法。子查詢只需返回并將您已經包含在外部查詢中的所有新內容加起來,并且它必須對每一行都這樣做。

看一看這個問題如何使用聯接來完成相同的任務。

用不斷增長的數據來解決性能下降的問題:因為有最大值。一年中有366天,我假設您沒有針對多年運行此查詢,子查詢將被評估366次。有了正確的日期索引和hasPaid標志,您就會沒事的。


查看完整回答
反對 回復 2019-06-16
?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

從MySQL 8開始,您將使用窗口函數對于這種查詢:

SELECT dayofyear(`date`) AS d, count(*), sum(count(*)) OVER (ORDER BY dayofyear(`date`))FROM `orders`WHERE `hasPaid` > 0GROUP BY dORDER BY d

在上面的查詢中,聚合函數count(*)嵌套在窗口函數中。sum(..) OVER (..),這是可能的,因為SQL中操作的邏輯順序..如果這太讓人費解,您可以很容易地使用派生表或WITH條款要更好地構造查詢:

WITH daily (d, c) AS (
  SELECT dayofyear(`date`) AS d, count(*)
  FROM `orders`
  WHERE `hasPaid` > 0
  GROUP BY d)SELECT d, c, sum(c) OVER (ORDER BY d)ORDER BY d


查看完整回答
反對 回復 2019-06-16
  • 3 回答
  • 0 關注
  • 1138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號