我有一個SQL查詢,我需要......MYSQL找到那些沒有在n天
基本上我有兩個表我需要使用的幫助更新的日誌條目賬戶。一個包含客戶賬戶,另一個包含客戶服務代表與客戶交互的日誌。我想要這個查詢給我在過去14天內沒有日誌條目(交互)的任何帳戶的id。我也想過濾掉幾個不相關的代表賬戶(使用assignedto
字段,你會看到)。另外,日誌表中的日期格式非常時髦,我不能改變它,因爲我沒有編寫的軟件也使用這個數據庫。
這兩個表格是cm.dbs (customer accounts)
和cm.log (interaction log)
。
這是我想出的查詢,但需要運行FOREVER。子查詢完美地工作並且只需要幾分之一秒,但是當主要查詢與子查詢一起運行時,它只是非常慢。我猜這是因爲子查詢正在爲主查詢中的每一行運行(並且不需要),但我對於如何解決這個問題毫無頭緒,因爲我不是SQL專家,我足夠了解創建基本到中間的查詢,這不是我以前做過的事情。
這裏是我創建至今的查詢:
SELECT id FROM cm.dbs WHERE id NOT IN (SELECT filenumber FROM cm.log
WHERE STR_TO_DATE(logdate, '%m/%d/%Y')
BETWEEN DATE_SUB(NOW(), INTERVAL 14 DAY)
AND NOW()
GROUP BY filenumber)
AND assignedto != 'OLD_ACCTS'
AND assignedto != 'HOUSE_ACCOUNTS'
AND assignedto != 'PAID_ACCOUNTS';
子查詢查找具有在過去兩週內,在日誌表項的賬戶。它完美地完成了這項工作。然後訣竅就是讓主查詢找到所有沒有條目的賬戶。
另請注意,cm.log中的filenumber
字段對應於cm.dbs
表中的id
。
我可能以一種完全愚蠢的方式來解決這個問題,我不是在承認這一點。任何有關使這項工作正確和有效的投入是讚賞。我也喜歡任何人推薦解釋的修復/更改。我不是簡單地想要爲我建立的查詢,我想了解我做錯了什麼,以及如何更好地做到這一點,所以下次我可以自己弄清楚。我很少問過這樣的問題,我通常會自己弄清楚這些問題,但這讓我很難過。
編輯:這裏是表中的相關領域的部分架構:
cm.dbs:
id int(10) UN PK AI
title varchar(45)
firstname varchar(200)
middlename varchar(200)
lastname varchar(200)
fullname varchar(200)
address varchar(200)
address2 varchar(200)
city varchar(200)
state varchar(200)
zip varchar(50)
assignedto varchar(200)
...
cm.log:
id int(10) UN PK AI
filenumber varchar(200)
agentname varchar(200)
logtime varchar(200)
logdateandtime varchar(200)
logdate varchar(200)
logmessage mediumtext
您能否提供涉及查詢的兩個表的模式。兩張桌子都有多少記錄? – Rahul
cm.dbs表字面上有超過100個字段,所以我不確定是否發佈了所有有效的產品,但是如果您覺得有必要,我會這樣做。如果你想知道什麼樣的索引,鑰匙等,那裏沒有。這是由第三方創建的數據庫,它確實寫得很差。多麼糟糕?那麼,那個時髦的日期字段?這是一個VARCHAR(200)。爲什麼!!!?? –
一個優化就是將'logdate'字段轉換爲本地類型 - 您迫使mysql將該字符串轉換爲表中每條記錄的日期值。這可以防止使用索引並強制每次都進行全表掃描。 –