2012-06-10 14 views
24

これまでのところこれを把握することはできません。私は2つのテーブルを結合しようとしているだけで、テーブルBの一致する列を持たないテーブルAの行を選択します。たとえば、ユーザーテーブルと送信テーブルがあると仮定します。他のテーブルに一致する列を持たないMySQL選択行

usersテーブルには、次の列があります。id, username
sentテーブルには、次の列があります。id, username

私はusernamesentテーブルに存在しないusersからすべての行を選択します。したがって、tomusersにあり、sentにある場合、彼は選択されません。彼がusersにいるがsentにない場合、彼が選択されます。私はこれを試してみましたが、それは全く動作しませんでした:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname 

答えて

12

このSQLを試してみてください:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.username = users.username 
WHERE sent.username IS NULL; 

私の意見でより良い方法は、次のようになります。両方として

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.id = users.id 
WHERE sent.id IS NULL; 

IDフィールド、インデックス付けされます(主キー、私は考えを持っているでしょう)ので、このクエリは私が提案した最初のものよりも最適化されます。

私の最初の提案はあなたのために良いかもしれませんが、あなたのアプリケーションの要件が何であるかによって異なります。

+0

あなたの問題を解決する同じ問題もあったが、これにこのクエリ

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1); 

希望を使用して解決します他のヘルプ私はこれも動作することがわかった:SELECT * FROM pooltest LEFT JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sentname IS NULL – xendi

53

通常、クエリ

SELECT p.Name 
FROM pooltest p 
WHERE NOT EXISTS (SELECT s.Name 
        FROM senttest s 
        WHERE s.Name = p.Name) 

、このタイプのNOT EXISTSを使用する代わりにLEFT OUTER JOINを使用してNULL

をチェックすることです
SELECT p.Name 
FROM pooltest p 
     LEFT OUTER JOIN senttest s ON s.Name = p.Name 
WHERE s.Name IS NULL 

使用している暗黙的な結合構文は廃止予定であるため、明示的な結合で置き換える必要があります。

-3

この1つはあなたを助けることができるかもしれませ....

私はこの1つはいくつかを

関連する問題