【发布时间】:2014-12-29 17:23:30
【问题描述】:
我看到了很多查找重复记录并删除它们的方法,但我找不到我要查找的方法,即根据特定条件删除它们。
下面的第一个 SQL 代码取自另一篇文章,非常适合定位重复项。但是,我对第二部分有疑问。
<cfquery datasource="mydatabase" name="duplist">
SELECT a.*, b.totalCount AS Duplicate
FROM mytable a
INNER JOIN
(
SELECT email, COUNT(*) totalCount
FROM mytable
GROUP BY email
HAVING COUNT(*) > 1
) b ON a.email = b.email
</cfquery>
<cfoutput query="duplist">
<CFQUERY DATASOURCE="mydatabase" name="dlist">
SELECT * FROM mytable
WHERE userid = '#userid#'
AND activedate is null
</CFQUERY>
</cfoutput>
<cfoutput>
Total To Be Deleted: #dlist.recordcount#
</cfoutput>
我正在尝试使用 SELECT(在将其替换为 DELETE 之前)仅根据输出查询“duplist”和重复的电子邮件记录,那些没有“活动日期”的重复用户电子邮件。我只得到一条记录(在#dlist.recordcount# 中),这是最后一条记录!查询不应该遍历它们吗?
已编辑:
经过一些反馈并检查记录计数不正确,因为它在循环之外。它将在没有 startdate 的情况下检索这些记录。但是,现在真正的问题在于以下场景:
ID USERID EMAIL STARTDATE
1 user1 test@test.com
2 user2 test@test.com 11/01/2014
3 user3 test@test.com
4 user4 test@test.com 11/02/2014
5 user5 me@mydomain.com
6 user6 me@mydomain.com
运行上面的代码会列出这6条重复邮件的记录。第二个查询将选择(删除)那些没有开始日期的,即记录 1、3、5 和 6。两个问题:
- 记录 1 和 3 将被删除,但记录 2 和 4 仍然重复
- 记录 5 和 6 将被删除,我的电子邮件中没有用户。我需要保留其中一个。
如何修改代码以应对场景?我想保留记录 #4 和 #6,因为 4 比 2 新,而 6 比 6 新。
4 user4 test@test.com 11/02/2014
6 user6 me@mydomain.com
【问题讨论】:
-
这是
cfoutput的正确行为。如果要查看所有记录,则一一查看;将最后一条语句<cfoutput>Total To Be Deleted: #dlist.recordcount# </cfoutput>移动到<cfoutput query="duplist"><cfquery>....</cfquery></cfoutput>。您将看到预期的输出n次数。 -
它可能会在那里循环,但是第二个查询有一个条件。把它放在那里不会正确计算它应该在第二个查询中过滤的内容。
-
如果你想要正确的计数,你需要在
<cfoutput query="duplist">中使用一个变量,如果#dlist.recordcount#大于0,则增加它。 -
计数可能是错误的,但我真正想要实现的是删除正确的重复记录,该记录具有 activedate null 但代码没有这样做......
-
预期输出是什么?根据编辑后的数据样本,删除后要保留哪些记录。
标签: mysql sql coldfusion duplicates