查询在不同表中对具有相同文本的列进行分组

时间:2014-08-21 20:35:28

标签: mysql sql

我的数据库中有两个表,'用户'和'帐户'。

每个都有一个名为'email'的列

我最想做的是查询'users'并返回所有与'accounts'中的行之一没有相同电子邮件的行,然后DROP那些整行。

我开始尝试制作一个查询,该查询返回“用户”中的所有行,这些行中有一封电子邮件存在于“帐户”的其中一行中

SELECT * FROM `users` WHERE users.email = accounts.email

这使用语法“users.email”给我一个错误。

非常感谢任何帮助!

修改

为了澄清,我的问题是我的设备(用户)是由未创建帐户的人(通过他们的电子邮件地址唯一标识)注册到我的数据库的。这些设备仍然使用电子邮件地址注册,而不是那些属于合法帐户的设备,因此电子邮件永远不会为空。我想形成一个查询,返回“用户”的所有行,其电子邮件列与“帐户”表中的任何电子邮件都不匹配,以便我可以删除这些用户。

我只是使用PHP以更简单的方式解决了这个问题,但是为了回答我原来的问题: 我所尝试的基本上与此相反:

SELECT email
FROM users
JOIN accounts
ON users.email=accounts.email;

该查询将返回所有具有电子邮件的用户行,该电子邮件也存在于帐户表的电子邮件列中,这意味着该设备已注册到合法帐户。我想反过来说,这个查询会返回所有用户的行,其中'user'中的电子邮件字段与'accounts'中的任何电子邮件字段都不匹配,这样我就可以删除这些设备了。

3 个答案:

答案 0 :(得分:2)

如果您想要帐户中没有相应电子邮件地址的用户列表,您可以使用帐户电子邮件为空的左联接。

将其放入子选择以进行删除将允许您删除不在帐户中的用户中的所有行。 (我已经删除了安全删除)

select *
--delete 
from
  `users`
where `users`.email in (
    select u.email
    from
      `users` u
       left join `accounts` a on u.email = a.email
    where
      a.email is null)

您可以在 fiddle

中看到这种情况

答案 1 :(得分:1)

您可以做的是join声明

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

是如何从另一个表中获取=

有一个例子here

答案 2 :(得分:1)

抱歉,文字墙。让我从这里开始:

  

我想形成一个查询,返回“用户”的所有行,其电子邮件列与“帐户”表中的任何电子邮件都不匹配,以便我可以删除这些用户。

我认为您需要首先解决问题,并确保向他们发送验证电子邮件,其中包含他们在注册过程中必须单击的链接。你不会再遇到这个问题了。

现在,您正在寻找的查询

  

该查询将返回帐户表的电子邮件列中也存在电子邮件的所有用户行...如果'users'表的'email'字段中存在无效的电子邮件,则

如果我理解正确,您将需要对两个表中存在的记录(电子邮件地址)执行子查询。然后,从该查询中,您将仅选择帐户表中没有电子邮件的查询。真正帮助我们所有人理解的是SQL Fiddle上的模拟。

我在下面制作了一个模型,我做了一个返回如下结果的查询:(让我先解释变量)

...

exist_in_both.aemail#=>电子邮件存在于两者中,可在帐户表

中找到

exist_in_both.uemail#=>电子邮件存在于两者中,可在用户表中找到

电子邮件#=>

中不存在的电子邮件

...此处的查询结果:http://sqlfiddle.com/#!2/67050/26如下所示:

exist_in_both.aemail, exist_in_both.uemail, email

现在,我对这些结果进行查询,并且只选择在单个表中具有现有列的那些结果,而不是在两个表中存在的完整列。看起来像这样:http://sqlfiddle.com/#!2/67050/38

您需要的查询,返回仅存在于帐户表中的电子邮件,但不返回用户表和帐户表中存在的电子邮件。 A,b和c在帐户中,a和b在用户中,这将选择c。 :)

SELECT derived_table.email from (select * 
  from (
    SELECT u.email as uemail, a.email as aemail 
    from users u join accounts a 
    WHERE u.email = a.email) exist_in_both
  RIGHT JOIN accounts on accounts.email = exist_in_both.aemail) derived_table
WHERE derived_table.uemail IS NULL

从内到外工作:您选择两者中存在的电子邮件,然后右键加入仅存在于一个表中的电子邮件。然后,从该结果集中查询那些未在结果中显示的“两者都存在”的电子邮件。

在不幸的情况下,您在用户中不存在的帐户中存在电子邮件,并且您在帐户中不存在的用户中存在电子邮件,这里是一个SQL小提琴,这种情况正在发生,以及解决该问题的查询。 (仅限UNION)http://sqlfiddle.com/#!2/ed2814/1