我有一个 SQL 查询需要帮助...
基本上我有两个需要使用的表。一个包含客户帐户,另一个包含客户服务代表与客户交互的日志。我希望此查询为我提供过去 14 天内没有日志条目(交互)的任何帐户的 ID。我还想过滤掉一些不相关的代表帐户(使用您将看到的分配给
字段)。另外,日志表中的日期格式是时髦的非标准,我无法更改它,因为我没有编写的软件也使用这个数据库。
这两个表是cm.dbs(客户帐户)
和cm.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
最佳答案
您的查询对我来说看起来是正确的,除了下面的更改(因为您有多个 assignedto
值需要检查,请使用 IN
运算符,而不是将它们放在单独的 或仅
。)
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 NOT IN ('OLD_ACCTS','HOUSE_ACCOUNTS','PAID_ACCOUNTS');
关于MYSQL查找n天内没有更新日志条目的帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141692/