まずSQLを書く SELECT DISTINCT from_id タラから cod.from_id が (37, 56, 57) に含まれない場所 今日 SQL を書いていたところ、クエリ結果が不完全で、NULL 値が欠落しており、さらに存在しない場合は null が除外されていることに気付きました。 inを使用する場合、nullは含まれません MySQL は適切に設計されていないように感じます。 なぜなら、in と not in は互いに補完し合うべきだと私は常に思っていたからです。検索全体は次のようになるはずです。 SELECT DISTINCT from_id タラから cod.from_id が (37, 56, 57) ではない、または cod.from_id が (37, 56, 57) である 結果は予想通りで、nullが欠落しています 後でオンラインで調べたところ、合理的な説明が見つかりました。 nullはどの値と比較しても偽である たとえば、from_id が (37, 56, 57,28,null) の場合、28 と比較すると not in (37, 56, 57) は true なので、結果セットには 28 が表示されます。 null を条件 not in (37, 56, 57) と比較すると、結果は false となるため、結果セットには表示されません。 補足:MySQL条件クエリINとNOT INの両側でNULL値を処理する方法 トピックテーブル ツリーの場合、id はツリー ノードの番号であり、p_id はその親ノードの ID です。 +----+------+ | id | p_id | +----+------+ | 1 | NULL | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 2 | +----+------+ ツリー内の各ノードは、次の 3 つのタイプのいずれかになります。 リーフ: このノードに子ノードがない場合。 ルート: このノードがツリー全体のルートである場合、つまり親ノードがない場合。 内部ノード: ノードがリーフ ノードでもルート ノードでもない場合。 すべてのノードの数とタイプを出力するクエリ ステートメントを記述し、結果をノード番号で並べ替えます。上記の例の結果は次のようになります。 +----+------+ | id | タイプ | +----+------+ | 1 | ルート | | 2 | 内側| | 3 | 葉 | | 4 | 葉 | | 5 | 葉 | +----+------+ 説明する ノード '1' は親が NULL であり、子ノード '2' と '3' を持つため、ルート ノードです。 ノード「2」は親ノード「1」を持ち、子ノード「4」と「5」も持っているため、内部ノードです。 ノード「3」、「4」、および「5」は親ノードを持ち、子ノードがないため、リーフノードです。 この例のツリーは次のようになります。 1 / \\ 23 / \\ 4 5 まずテーブルを作成する 1. テーブルを作成する テーブルツリーの作成( id INT 、 p_id 整数 ) やり方は次のとおりです: SELECT id,( 場合 tree.p_id が NULL の場合、'Root' WHEN tree.id NOT IN ( -- id が親ノードの p_id 列にない場合は、論理的に正しいリーフノードと見なされます。 p_idを選択 木から GROUP BY p_id )そして「葉」 ELSE「内側」 終わり )タイプ 木から 親ノードの p_id 列に id がない場合、リーフ ノードと見なされると思います。論理的にはまったく問題はありません。ただし、物事はそれほど単純ではありません。クエリ結果は次のとおりです。id=3 から始めて、必要な結果が見つかりませんでした。すごいですね! そしてもう一晩経って、ついに問題を解決しました。まずは正しいアプローチを紹介します。 SELECT id,( 場合 tree.p_id が NULL の場合、'Root' tree.id が ( に含まれない ) の場合 p_idを選択 木から WHERE p_id IS NOT NULL -- SQL文を追加しました GROUP BY p_id )そして「葉」 ELSE「内側」 終わり )タイプ 木から なぜこのようなことが起こるのでしょうか? 周知された MySQL の IN 演算子は、式の値が指定されたリスト内にあるかどうかを判断するために使用されます。リスト内にある場合、戻り値は 1 になり、それ以外の場合は戻り値は 0 になります。 NOT IN の機能は IN と正反対です。NOT IN は、指定されたリストに式の値が存在しないかどうかを判断するために使用されます。存在しない場合は戻り値は 1 になり、存在する場合は戻り値は 0 になります。 これが私たちが通常使用する方法であり、結果は私たちが望んでいる通りです。しかし、次のような特殊な状況に遭遇することがよくあります。 (1)inまたはnot inのどちらの側にもNULL値は存在しない[例 1] SQL 文で IN 演算子と NOT IN 演算子を使用する: mysql> SELECT 2 IN (1,3,5,'thks'),'thks' IN (1,3,5, 'thks'); +---------------------+---------------------------+ | 2 IN (1,3,5,'thks') | 'thks' IN (1,3,5, 'thks') | +---------------------+---------------------------+ | 0 | 1 | +---------------------+---------------------------+ セットに 1 行、警告 2 件 (0.00 秒) mysql> SELECT 2 NOT IN (1,3,5,'thks'),'thks' NOT IN (1,3,5, 'thks'); +-------------------------+-------------------------------+ | 2 は (1,3,5,'thks') に含まれません | 'thks' は (1,3,5, 'thks') に含まれません | +-------------------------+-------------------------------+ | 1 | 0 | +-------------------------+-------------------------------+ セットに 1 行、警告 2 件 (0.00 秒) 結果から、IN と NOT IN の戻り値がまったく逆であることがわかります。 しかし、私はNULL値の問題を無視しました NULL値の取り扱い IN 演算子のいずれかの側が NULL の場合、一致するものが見つからない場合、戻り値は NULL になります。一致するものが見つかった場合、戻り値は 1 になります。 (2)NULL値はinの両側にある次の SQL ステートメントを参照してください。 mysql> SELECT NULL IN (1,3,5,'thks'),10 IN (1,3,NULL,'thks'); +------------------------+-------------------------+ | NULL IN (1,3,5,'thks') | 10 IN (1,3,NULL,'thks') | +------------------------+-------------------------+ | NULL | NULL | +------------------------+-------------------------+ セットに 1 行、警告 1 件 (0.00 秒) mysql> SELECT NULL IN (1,3,5,'thks'),10 IN (1,10,NULL,'thks'); +------------------------+---------------------------+ | NULL IN (1,3,5,'thks') | 10 IN (1,10,NULL,'thks') | +------------------------+--------------------------+ | NULL | 1 | +------------------------+--------------------------+ セット内の 1 行 (0.00 秒) (3)NOT INの片側がNULLNOT IN は正反対です。NOT IN 演算子の 2 つの辺のうちの 1 つが NULL 値 NULL の場合、一致するものが見つからない場合は戻り値は NULL になり、一致するものが見つかった場合は戻り値は 0 になります。 次の SQL ステートメントを参照してください。 mysql> SELECT NULL NOT IN (1,3,5,'thks'),10 NOT IN (1,0,NULL,'thks'); +----------------------------+----------------------------+ | NULL は (1,3,5,'thks') に含まれません | 10 は (1,0,NULL,'thks') に含まれません | +----------------------------+----------------------------+ | NULL | NULL | +----------------------------+----------------------------+ セットに 1 行、警告 1 件 (0.00 秒) mysql> SELECT NULL NOT IN (1,3,5,'thks'),10 NOT IN (1,10,NULL,'thks'); +----------------------------+------------------------------+ | NULL は (1,3,5,'thks') に含まれません | 10 は (1,10,NULL,'thks') に含まれません | +----------------------------+------------------------------+ | NULL | 0 | +----------------------------+------------------------------+ セット内の 1 行 (0.00 秒) (3)NOT INの片側がNULLであることから、問題が分かります。 まず次のSQL文をクエリして、ゆっくりと問題を見つけてみましょう。 p_idを選択 木から GROUP BY p_id 上記のクエリ結果にはNULL値が含まれています したがって、次のSQL文はNOT INがNULLを返すため、何も見つかりません。 選択ID 木から id が ( に含まれない ) p_idを選択 木から GROUP BY p_id ) したがって、結果を照会する場合は、まず NULL 値を処理する必要があります。はい、バグは修正されました! この問題を解く別の方法があります: SELECT id,( 場合 tree.p_id が NULL の場合、'Root' tree.idがIN( p_idを選択 木から GROUP BY p_id )そして「内側」 ELSE「葉」 終わり )タイプ 木から なぜそれが正しいのでしょうか?それは皆さんに考えさせてください〜 上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。 以下もご興味があるかもしれません:
|
>>: XHTML チュートリアル、XHTML の基礎を簡単に紹介します
目次1. はじめに2. レンダリング3. コード4. 学生情報管理システムのメインインターフェース1...
序文:一部のアプリケーション シナリオでは、成績や年齢によるランキングなど、ランキングの問題が発生す...
パスワードを忘れると困ります。Mac に MySQL をインストールするための初期パスワードを忘れて...
目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...
序文クエリの最適化は一夜にして達成できるものではありません。対応するツールの使い方を学び、他の人の経...
目次概要プロパティ設定処理ロジック概要具体的な需要シナリオは次のとおりです。 Excel ファイルを...
この記事では、セカンダリメニュー効果を実現するためのJavaScriptの具体的なコードを参考までに...
問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...
1. 新しいユーザーwwweee000を作成します [root@localhost ~]# user...
コンポジション継承組み合わせ継承は、疑似古典的継承とも呼ばれます。これは、昨日説明したプロトタイプ ...
この記事では、MySQL のトランザクション管理操作について説明します。ご参考までに、詳細は以下の通...
シナリオ最大 10000 要素のリストを正しくレンダリングする方法。無限ドロップダウン読み込みテクノ...
execute、executeUpdate、executeQuery の違い (およびそれらの戻り値...
目次概要1. Refsオブジェクトの作成1.1 React.createRef() 1.2React...
WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...