簡體   English   中英

MySQL多個日期子查詢

[英]MySQL multiple Date subqueries

我正在為一個非常具體的報告編寫查詢,該報告包含基於項目的特定關系的可變列數。 我願意就如何更改查詢提出建議,但我認為不可能。 我寧願將其保留為單個查詢,而不是循環運行。 正在搜索的表包含大約400萬條記錄,無法存檔。

我想知道的是,為什么在子查詢中不使用DATEADD索引,盡管在同一表的外部查詢中使用了DATEADD索引。 我知道字段上的函數使MySQL無法建立索引,但這僅在項目上,而不是您要與之進行比較的項目。

報告的結果是該范圍內發生日期的每個日期的每個特定項目(子查詢)的數字。 日期范圍是動態生成的。 子查詢應返回一天的結果

我們正在使用MySQL 5.0.77版本,由於它是由托管服務提供商管理的,因此無法更改。

這是查詢:

 SELECT DATE_FORMAT(DATEADD, '%d/%m/%y') AS DATEADD,

   (SELECT COUNT(ID)
      FROM ATABLE AS 
     WHERE ELEMNAME = 'ANELEMENT' AND COMPID = 132
           AND VT.DATEADD BETWEEN CONCAT(DATE(V.DATEADD)," 00:00:00") AND CONCAT(DATE(V.DATEADD)," 23:59:59")))
      AS '132',

   (SELECT COUNT(ID)
      FROM ATABLE AS 
     WHERE ELEMNAME = 'ANELEMENT' AND COMPID = 149
           AND VT.DATEADD BETWEEN CONCAT(DATE(V.DATEADD)," 00:00:00") AND CONCAT(DATE(V.DATEADD)," 23:59:59")))
      AS '149'

 FROM ATABLE AS V
WHERE 1 = 1 AND COMPID = 132
   AND (V.DATEADD >= "2010-09-01 00:00:00"
        AND V.DATEADD <= "2010-10-26 23:59:59")
   AND 1 = 1
   AND ELEMNAME = 'ANELEMENT'
GROUP BY DATE_FORMAT(DATEADD, '%Y-%m-%d')

子查詢的運行次數取決於該項目所具有的鏈接數,並在構建查詢時確定。

我們已經嘗試過:用

"VT.DATEADD <= DATE(V.DATEADD) and VT.DATEADD <= DATE(V.DATEADD) +1" 

但是,這也不起作用,將其更改為

"VT.DATEADD = DATE(V.DATEADD)" 

確實使用了索引,但是沒有返回正確的行數,因為DATEADD是日期時間。 如果我們將其更改為:

"VT.DATEADD >= "2010-09-01" AND VT.DATEADD <= "2010-09-02"

Explain的輸出是

+----+--------------------+-------+-------+-------------------------+----------+---------+-------+-------+----------------------------------------------+
| id | select_type        | table | type  | possible_keys           | key      | key_len | ref   | rows  | Extra                                        |
+----+--------------------+-------+-------+-------------------------+----------+---------+-------+-------+----------------------------------------------+
|  1 | PRIMARY            | V     | range | DATEADD,COMPID,ELEMNAME | DATEADD  | 8       | NULL  |  1386 | Using where; Using temporary; Using filesort |
|  2 | DEPENDENT SUBQUERY | VT    | ref   | COMPID,ELEMNAME         | ELEMNAME | 103     | const | 44277 | Using where                                  |
+----+--------------------+-------+-------+-------------------------+----------+---------+-------+-------+----------------------------------------------+

使用USE INDEX或FORCE INDEX(在可用但未使用時)使用NULL鍵

在不解決此問題的情況下,即使在很小的日期范圍內,查詢的運行速度也非常慢,並且將數據庫鎖定。

我不知道我是否過度簡化了總體需求,但是這一點對您有用。 您似乎想知道在給定日期范圍內兩個“ compli”值的活動量。

SELECT 
      DATE_FORMAT(DATEADD, '%Y-%m-%d'),
      SUM( if( compid = 132, 1, 0 ) ) as Count132,
      SUM( if( compid = 149, 1, 0 ) ) as Count149
   from
      ATable 
   where
          elemname = "ANELEMENT"
      AND ( compid = 132 or compid = 149 )
      AND DATEADD BETWEEN "2010-09-01 00:00:00" AND "2010-10-26 23:59:59"
   group by
      dateadd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM