0

2 つのテーブル (存在する場合はテーブル内の ID、存在しない場合は NULL または空) を簡単に確認できるようにする、巧妙な MySQL スニペットを見つけ出す必要があります。

ユーザーテーブルとレガシーテーブルがあり、手動比較以外では、それらを一緒にテーブルに表示して比較できるようにする方法がわかりません。私が見たいのは、次のようなものです。

+----------------------------+
| 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
    )
);

ここには 3 つのテーブルが含まれますlegacy_users => migrate_map_users => users。中間は、2 つを結合する単なる m2m です。legacy_users と users の両方に email 列があります。および ID の独自のバージョン。

皆さん、ありがとうございました!

4

3 に答える 3

1

Oded's answer のおかげで、これは私が最終的に得たものです:

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 に答える
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

??

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

-- 開始するための 2 つのクエリ

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 に答える