0

私はmysqlが何かをする方法の奇妙な方法を見つけました。なぜそれが起こるのか誰かが説明してください。

テーブルAからすべての列を選択し、テーブルAの行ごとに満たされる場合と満たされない場合がある特定の条件で、テーブルBから左結合します。

結合後、WHEREステートメントで、テーブルBの結果が存在する場合(存在しない場合)に値14のテーブルBの列categoryIdを持つ行(結合部分ではなく行全体)を完全に除外したいと思います。 、行を保持したい)。

だから私はどこでWHERE tableB.categoryId != 14。結果はありません(あるはずの場合)。好奇心のために、演算子を=に書き直そうとしたのでWHERE tableB.categoryId = 14、結果として、私が望んでいた結果が得られず、aと私が望まなかった結果が得られました。

私はこれを理解していません、これは奇妙です。
等しくないことがうまくいったのではないでしょうか?
!()も試しtableB.categoryId = 14ましたが、結果が得られませんでした。最後に、私は試しましたWHERE IF(tableB.categoryId = 14, 0, 1)、そしてそれは何らかの理由でうまくいきました。なぜそれが機能したのか、そしてなぜ等しくない演算子と否定演算子が機能しなかったのか?

4

2 に答える 2

0

あなたの問題は左結合とは何の関係もないと思います。

デバッグするには、左結合を使用しない単純なクエリを試す必要があります。ただSELECT * FROM tableB WHERE categoryId = 14

また、categoryId の型を確認してください。問題は、すべてのコンテキストで機能しない int から文字列への暗黙的な変換である可能性があるため、明示的にすることをお勧めします。

于 2012-06-25T09:00:09.903 に答える