我不完全確定如何措辭標題。我有一個我無法弄清楚的查詢:
我有一個帶有時間戳(1970 紀元十進制)的表“值”和每行一個 blob。我有一個名為“keys”的第二個表,其中包含一個時間戳和密鑰,用于解密第一個表“values”中的每個 blob。密鑰以隨機間隔定期更改,每次密鑰更改時,都會將一組新密鑰寫入“密鑰”表。有多個鍵,當一個新的鍵集寫入“鍵”表時,每個鍵都有一個具有相同時間戳的單獨條目。
如果我做這樣的事情:
select distinct timestamp from keys;
每次輪換密鑰時,我都會回傳一個集合,并將一個新的密鑰集寫入資料庫。
我想要的是 mysql 中的一個 sql 陳述句,它回傳每個鍵集的時間戳以及每個鍵時間戳之間“值”表中的記錄總數。
例如:
| 時間戳 | 數數 |
|---|---|
| 1635962134 | 23 |
| 1636048054 | 450 |
| 1636145254 | 701 |
等等...
最后一行需要特別考慮,因為它的“當前”集在密鑰表中沒有另一個條目(還......)
SQL Fiddle with Sample Data: SQL FIDDLE WITH SAMPLE DATA
對于上面的示例資料,結果應該是: | 時間戳 | 計數 | | --------- | ----- | | 1635962134 | 14| | 1636043734 | 28| | 1636119328 | 11|
uj5u.com熱心網友回復:
您受到 mySQL 版本的一些限制,但您可以使用變數來幫助創建行集。您也可以使用連接來實作,但會稍微復雜一些。
https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=b5d587b30f1a758ce31e3fa4745f26d0
SELECT k.key1, k.key2, count(*) as vol
FROM my_values v
JOIN (
SELECT key_ts as key1, @curr-1 as key2, @curr:= key_ts
FROM (
SELECT DISTINCT key_ts FROM my_keys
JOIN (SELECT @curr:=9999999999) var
ORDER BY key_ts DESC
) z
) k ON (v.val_ts BETWEEN k.key1 and k.key2)
GROUP BY key1, key2
首先(最里面的子查詢)從 my_keys 中選擇不同的時間戳并對它們進行排序。我使用該連接來設定變數。您也可以在單獨的查詢中使用 SET 陳述句。我將變數設定為任意高的時間戳,以便系列中的最后一個時間戳將始終有一個合作伙伴。
從中選擇鍵和變數值減1(以防止重疊),然后將變數設定為當前鍵。這必須在選擇查詢中的其他所有內容之后完成。這將生成代表一個時間范圍的兩個配對時間戳。
然后只需將 my_values 連接到這些鍵,并使用 BETWEEN 作為連接條件。
讓我知道這是否適合您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/352421.html
