我有一个包含用户信息的表(UserInfo),有些用户可能在不同的UserId下两次在表中,如下所示:
UserId LastName FirstName active
000001 Jetson George 1
000002 Flintstone Fred 0
000003 Jetson George 1
000004 Flintstone Fred 1
000005 Barbara Hannah 1
每个用户只有1行应显示为活动状态,但应用程序中的错误导致两个用户条目具有唯一的UserIds,其活动设置为1。
然后我有另一个表,其中包含与UserId(UserRecords)关联的记录。在重复活动UserIds的情况下,两个UserId中只有一个将返回第二个表中的任何结果。因此:
SELECT
((SELECT count(*)
FROM UserRecords recs
where recs.UserId= inf.UserId)) as Records, *
FROM UserInfo inf
where inf.lastname = 'Jetson' and
inf.active='1' and
inf.firstname='George'
可能会返回:
Records UserId LastName FirstName active
0 000001 Jetson George 1
1273 000003 Jetson George 1
我想创建一个更新语句,将任何条目where active = '1' and Records='0'
的活动列更改为0,但有数百个用户具有重复条目,稍后可能会有更多。所以我想创建一个更新语句,找到这些并自动将它们设置为0。
我拥有的是
update UserId
set active = '0'
where (SELECT count(*)
FROM UserRecords recs
where recs.UserId= inf.UserId) = 0
该声明的问题在于它没有考虑重复的用户。可能有用户在UserRecords中还没有记录(但是)也没有重复的条目。将它们设置为0会导致系统问题。
那么,如何将更新语句更改为仅在有重复条目的情况下将活动标记为0?
非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
好的,这就是我推荐的内容。您想要更改where子句以仅指定重复项。此外,您实际上只想查看活动记录,因为如果存在重复的非活动记录则无关紧要。
为了查看是否有重复内容,您可以使用exists
。为了使用exists,首先我们要编写一个子查询来拉回重复记录,即具有相同名字和姓氏,不同id的任何东西,并且也是活动的。如果子查询返回某些内容,则exists将返回true,我们将更新记录。如果没有重复项,子查询将不会获取任何记录,并且exists将返回false。然后,我们不会更新记录。
update u
set active = 0
From UserInfo u
where (SELECT count(*)
FROM UserRecords recs
where recs.UserId= u.UserId) = 0
and u.active = 1
and exists (Select 1
From UserInfo u2
Where u2.lastname = u.lastname
and u2.firstname = u.firstname
and u2.userid <> u.userid
and u2.active = 1)
答案 1 :(得分:0)
试图停用它们你可以删除它们唯一的问题我看到如果有2个用户称为相同的东西会发生什么但是要删除它们的changin活动你可以
ALTER IGNORE TABLE `UserInfo` ADD UNIQUE INDEX idx_urows (last_name, first_name);
当你尝试添加副本时,这也会导致MySQL出错我会说你应该有一个电子邮件地址或用户特有的东西,因为名称不是唯一的。