Поиск данных, которые отсутствуют в базе данных - PullRequest
0 голосов
/ 01 октября 2010

Мне нужно выяснить какой-нибудь умный фрагмент MySQL, который позволит мне легко увидеть две таблицы: идентификаторы в таблице, если они существуют, или 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 и пользователей есть столбец электронной почты. и их собственная версия идентификатора.

Спасибо всем!

Ответы [ 3 ]

1 голос
/ 01 октября 2010

Вам необходимо узнать о типах соединений , в частности о левых и внешних соединениях:

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, независимо от того, есть ли соответствующая в правой или нет.

1 голос
/ 01 октября 2010

Благодаря ответу Одеда я получил следующее:

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;

Это также позволило мне определить результаты поиска. Bonus.

Обратите внимание, что он использует почту в левом соединении и электронную почту в правом соединении. Поскольку в правильном внешнем соединении почта не существует, мы должны использовать столбец электронной почты из legacy_users и наоборот.

1 голос
/ 01 октября 2010

??

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...