比较2个表并显示缺少的行

时间:2019-04-17 09:03:03

标签: mysql sql joomla1.5

最近我的joomla 1.5网站受到了垃圾邮件注册的攻击,所以我去了phpmyadmin并开始从jos_users中过滤和删除这些注册,但是我完全忘记了joomla注册还有2个表依赖项(jos_core_acl_groups_aro_map和jos_core_acl_aro),所以现在我有了具有90.000行的jos_users和具有120.000行的其他2个依赖表。

我发现此SQL命令可以填充3个表:

insert into  jos_core_acl_aro (section_value, value, name)
    select 'users', id, name from jos_users;

但是我发现这样做风险太大,无法在拥有120.000个注册的实时站点上使用,而且它还会恢复我已经在jos_users中删除的垃圾邮件注册

我需要一条SQL命令将jos_users表与其他2个表进行比较,并在jos_core_acl_groups_aro_map和jos_core_acl_aro中显示缺失的行,这些行是我从jos_users中删除的行。

我已经尝试过以下命令:

select * 
from tcpt_users 
where tcpt_users.id not in (select tcpt_core_acl_groups_aro_map.aro_id
                            from tcpt_core_acl_groups_aro_map)

但是这不起作用,它使mysql发出内存尖叫,我的服务器将崩溃。

有些方向会受到欢迎。

修改

好吧,我得到了您共享的别名概念,所以我运行了以下命令:

select * 
from tcpt_users a
left join tcpt_core_acl_aro b on a.id = b.value 
where b.value is null

但是仍然令mysql服务器发疯,这从一开始就对命令进行了格式正确的设置影响了我的服务器负载,我可能对服务器有一些限制,是否有办法限制要显示的行数?

编辑1 :我想我已经确定了行数限制,这就是我运行的内容:

select * 
from tcpt_users a
left join tcpt_core_acl_aro b on a.id = b.value 
where b.value is null
LIMIT 25

发生同样的事情,因为查询将永远持续并且我的服务器死机,因此我必须重新启动mysql。

此刻我没有选择权了,我现在可以寻求帮助

1 个答案:

答案 0 :(得分:1)

您可以使用左联接

select * from tcpt_users a
left join tcpt_core_acl_groups_aro_map b on a.id =b.aro_id 
where b.aro_id is null