web-dev-qa-db-ja.com

MySQLは、他のテーブルに一致する列がない行を選択します

今のところこれを理解することはできないようです。 2つのテーブルを結合して、テーブルBに一致する列がないテーブルAの行のみを選択しようとしています。たとえば、ユーザーテーブルと送信テーブルがあるとします。

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

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

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

この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フィールドにはインデックスが付けられるため(主キーと考えていました)、このクエリは、最初に提案したクエリよりも最適化されます。

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

18
Haroon

通常、このタイプのクエリにはNOT EXISTSを使用します

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

別の方法としては、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

使用している暗黙的な結合構文は廃止されたと見なされ、明示的な結合に置き換える必要があることに注意してください。

59