2010-09-30 77 views
0

我需要弄清楚一些巧妙的MySQL代碼片段,這將允許我輕鬆查看兩個表,即表中的ID(如果它們存在)或NULL(空)或空(如果它們不存在)。查找數據庫中缺失的數據

我有一個用戶表和一個遺留表,手動比較之外我無法弄清楚如何使它們出現在一張表中,所以我可以比較。我很想看到的是這樣的:

+----------------------------+ 
| user_id | email  | uid | 
| 14  | [email protected] | 26 | 
| 16  | [email protected] | 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和用戶都有一個電子郵件列。和他們自己的id版本。

謝謝大家!

回答

1

您需要了解join types,尤其是左外連接:

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表中的所有記錄都將被返回,無論是否有相應的記錄。

+0

啊,你是對的。我想我正在尋找的是一個完整的外部聯接。您的鏈接提供了一個在MySQL – 2010-09-30 20:43:28

+0

中執行此操作的配方@Chuck Vose - FULL OUTER應提供_both_表中的所有記錄,而不管另一個記錄是否具有相應的記錄。 – Oded 2010-09-30 20:45:11

+0

MySQL不支持FULL OUTER JOIN語法。 – 2010-09-30 20:46:15

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 
+0

對不起,延期,我試了這個 – 2010-09-30 20:36:01

+0

我的問題是我試圖找到一方可能不存在的記錄。所以我想要所有電子郵件的列表,但我認爲你的加入不允許存在l.email或u.mail不存在的記錄(因爲該記錄不存在) – 2010-09-30 20:37:17

+0

我認爲兩者的結果這些查詢可以讓你朝着正確的方向前進 – Sage 2010-09-30 20:43:20

1

由於俄德的答案,這是我結束了:

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中的電子郵件列,反之亦然。