1

mysql では、tableAwith rowsuseridvalueAand tableBwith useridand valueB.

tableAtableB同じuserid.

私はいくつかのことを試しましたが、何が間違っているのかわかりません。

SELECT * FROM `tableA`
left join `tableB` on `tableA`.`userid` = `tableB`.`userid`

これは実際には非常に良いスタートです。からのすべてのエントリtableA+ からの対応する値が得られtableBます。存在しない場合は、NULL(phpmyadmin で) として表示されます。

SELECT * FROM `tableA`
left join `tableB` on `tableA`.`userid` = `tableB`.`userid`
where `tableB`.`valueB` = NULL

残念ながら、空の結果です。たぶん、これは簡単すぎたでしょう。(ちなみに、tableA〜10kのtableBエントリがあり、それぞれに一意の〜7kのエントリがuseridあります。私がやりたいことをした場合、結果が空になることはありません)

SELECT * FROM `tableA`
left join `tableB` on `tableA`.`userid` = `tableB`.`userid`
where `tableA`.`userid` != `tableB`.`userid`

これもうまくいきません。正直なところ、完全にパラドックスに見えます。とにかく今は無知です。2 番目のクエリが機能しなかったのはなぜですか? 正しい解決策は何ですか?

4

4 に答える 4

3

あなたはほとんどそこにいます。その2番目のクエリはとても近いです! 必要なのは、ちょっとした調整だけです。

" "の代わりに、述語に= NULL" " が必要です。IS NULL

SELECT * FROM `tableA`
left join `tableB` on `tableA`.`userid` = `tableB`.`userid`
where `tableB`.`valueB` IS NULL
                        ^^

=比較の片側 (または両側) が NULL の場合、等価比較演算子は (TRUE または FALSE ではなく) NULL を返すことに注意してください。(リレーショナル データベースと SQL に関しては、ブール論理には 2 つではなく 3 つの値 (TRUE、FALSE、NULL) があります。)

ところで...クエリのパターン、外部結合テーブルのNULLのテストを伴う外部結合)は、一般に「アンチ結合」パターンと呼ばれます。通常のパターンでは、あいまいな結果を避けるために、JOIN 条件で参照された同じ列 (複数可)、または NOT NULL 制約を持つ列をテストします。(たとえば、'ValueB' が NULL 値を持つことができ、行を一致させた場合はどうなるでしょうか。それはまったく問題ありません。その行を返すかどうかによって異なります。)

tableB に一致する行がない tableA の行を探している場合、通常は次のようにします。

SELECT * FROM `tableA`
left join `tableB` on `tableA`.`userid` = `tableB`.`userid`
where `tableB`.`userid` IS NULL
                ^^^^^^  ^^

IS NULL テストはuserid列に対して行われることに注意してください。一致する行が見つかった場合、列は「非 null」であることが保証されます。(列が NULL だった場合、行は JOIN 述語の等価性テストを満たしていません。

于 2013-07-15T17:49:29.667 に答える
1

= NULLコードで forを変更IS NULLします。NOT EXISTS代わりに次を使用することもできます。

SELECT * 
FROM `tableA` A
WHERE NOT EXISTS (SELECT 1 FROM `tableB`
                  WHERE `userid` = A.`userid`)
于 2013-07-15T17:49:07.927 に答える
0

これは、NULL 値の使用を説明するのに役立ちます。

http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

于 2013-07-15T17:53:07.640 に答える
0

より安価なクエリは次のようになります。データベースが大きすぎる場合、推奨される他のすべてのクエリは高すぎます。

SELECT * FROM tableA a 
   WHERE a.userid NOT IN
     (SELECT  b.user_id FROM tableB b);
于 2013-07-15T18:11:47.413 に答える