0

我需要找出一些巧妙的 MySQL 代码片段,让我可以轻松查看两个表,表中的 id(如果它们存在)或 NULL 或空(如果它们不存在)。

我有一个用户表和一个旧表,在手动比较之外,我不知道如何让它们一起出现在一个表中,以便进行比较。我希望看到的是这样的:

+----------------------------+
| user_id | email     | uid  |
| 14      | me@me.com | 26   |
| 16      | ug@ug.com | NULL |
+----------------------------+

我知道有一种方法可以包含 NULL 或空值,但我不确定它是什么。到目前为止,这是我的异常 SQL 查询,是的,我知道在子选择中执行子选择很糟糕:

select uid from users where mail IN (
    select email from legacy_users where id NOT IN (
        select sourceid from migrate_map_users
    )
);

这里涉及三个表,legacy_users => migrate_map_users => users. 中间只是连接两者的m2m。legacy_users 和 users 都有一个 email 列。以及他们自己的 id 版本。

谢谢你们!

4

3 回答 3

1

??

select u.uid, u.mail, l.email, l.id
from users u
left outer join legacy_users
    on u.mail = l.email

-- 两个查询让你开始

select u.uid, u.mail, l.email, l.id
from users u
left outer join legacy_users
    on u.mail = l.email
Where l.id is null

select l.email, l.id, u.uid, u.mail
from legacy_users l
left outer join users u
    on l.email = u.mail
Where u.uid is null
于 2010-09-30T20:30:28.557 回答
1

您需要了解连接类型,尤其是左连接和外连接:

SELECT u.uid, u.mail, lu.id
FROM users u
LEFT OUTER JOIN legacy_users lu 
    ON u.email = lu.mail
WHERE lu.id NOT IN
   (
        SELECT sourceid 
        FROM migrate_map_users
    );

LEFT OUTER JOIN 将确保 LEFT 表中的所有记录都将被返回,无论右表中是否有对应的记录。

于 2010-09-30T20:37:01.380 回答
1

感谢 Oded 的回答,这就是我最终得到的结果:

SELECT * 
FROM (
  SELECT id, mail, uid 
  FROM users  
  LEFT OUTER JOIN 
    legacy_users lu ON users.mail = lu.email 
  UNION DISTINCT 
  SELECT id, email, uid 
  FROM users  
  RIGHT OUTER JOIN 
    legacy_users lu ON users.mail = lu.email
) j 
WHERE uid IS NULL 
OR id IS NULL;

这也使我能够对结果进行定位。奖金。

请注意,它在左连接中使用邮件,在右连接中使用电子邮件。由于右外连接中不存在邮件,我们必须使用 legacy_users 中的 email 列,反之亦然。

于 2010-09-30T20:44:08.167 回答