MySQL の条件文で 1 つの情報しか読み取れない問題に対する 2 つの解決策

MySQL の条件文で 1 つの情報しか読み取れない問題に対する 2 つの解決策

今日、私の同僚が MYSQL クエリ ステートメントの作成時に非常に奇妙な問題に遭遇しました。MySQL マルチ テーブル クエリを使用する場合、1 つのテーブルのフィールドが別のテーブルのクエリ条件として使用され、読み取れる情報は 1 つだけですが、数字を直接使用すると正常に読み取ることができます。

SQL ステートメントは次のとおりです。

テーブル a、テーブル 2 b から a.id、a.title、b.idlist、b.aid を選択します。ここで、a.id は (b.idlist) であり、b.aid=2 です。

テーブル2のidlistフィールドはvarchar型で、テーブルに複数のID情報( 1,2,3,4を格納します。

上記のステートメントは、通常のクエリに使用できますが、クエリできる情報は 1 つだけです。ただし、次のステートメントを使用すると、通常の読み取りに使用できます。

テーブル a、テーブル 2 b から a.id、a.title、b.idlist、b.aid を選択します。ここで、a.id は (1,2,3,4) であり、b.aid=2 です。

これは非常に奇妙な問題です。最初はデータ型の問題だと思いましたが、 1,2,3,4の形式でデータを保存するには、文字型しか使用できません。さまざまな方法を試しましたが、MYSQL の FIND_IN_SET() 関数を見つけるまで問題を解決できませんでした。以下は、FIND_IN_SET() 関数の基本的な紹介です。

構文: FIND_IN_SET(str,strlist)

意味:

1. 文字列 str が N 個のサブチェーンで構成される文字列リスト strlist 内にある場合、戻り値の範囲は 1 から N になります。

2. 文字列リストは、「,」記号で区切られた複数の自己リンクで構成される文字列です。

3. 最初の引数が定数文字列で、2 番目の引数が typeSET 列の場合、FIND_IN_SET() 関数はビット単位の計算を使用するように最適化されます。

4. str が strlist にない場合、または strlist が空の文字列の場合、戻り値は 0 になります。

5. いずれかのパラメータが NULL の場合、戻り値は NULL になります。最初の引数にカンマ (',') が含まれている場合、この関数は正しく機能しません。

strlist: 英語のカンマ「,」で連結された文字列。例:「a,b,c,d」。この文字列は、カンマで連結された SET 型の値に似ています。

例: SELECT FIND_IN_SET('b','a,b,c,d'); //戻り値は2で、これは2番目の値です

では、まずは試しに元のSQL文を次のように変更してみましょう。

FIND_IN_SET(a.id,b.idlist) かつ b.aid=2 であるテーブル a、テーブル 2 b から a.id、a.title、b.idlist、b.aid を選択します。

変更したステートメントを実行すると、最終的に正常に読み取ることができます。原因を分析した結果、最終的にはデータ型の問題が原因でした。直接 in(b.idlist) を実行すると、読み取られる b.idlist は文字型であり、in は数字のみを受け入れます。どちらも "," が付いていますが、実際には完全に異なります。

さて、問題は解決しました。FIND_IN_SET() 関数の使用方法について詳しく知りたい場合は、このページの関連記事をお読みください。

以下もご興味があるかもしれません:
  • MySQL テーブルの読み取り、書き込み、インデックス作成、その他の操作の SQL ステートメントの効率最適化の問題を分析します。
  • 1 つ以上のフィールドに基づいて重複データを検索する MySQL SQL ステートメント
  • PHP で MySQL SQL ステートメントのクエリ時間を取得する方法
  • MySQL は SQL ステートメントの最新のレコードをクエリします (最適化)
  • MySQL は、あるテーブルのデータに基づいて別のテーブルの特定のフィールドを更新します (SQL ステートメント)
  • MySQLは文字列関数のSQL文をインターセプトします
  • SQL ステートメントを使用して、MySQL、SQLServer、および Oracle のすべてのデータベース名、テーブル名、フィールド名を照会します。
  • MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック
  • 1つのSQL文でMySQLの重複排除が完了し、1つが保持されます。
  • MySQL ステートメントの配置と概要の紹介

<<:  JS 9 Promise 面接の質問

>>:  VMware Workstation に Windows Server 2019 をインストールする (グラフィック チュートリアル)

推薦する

Linux CentOS MySQL データベースのインストールと設定のチュートリアル

MySQLデータベースのインストールに関するメモ、みんなで共有a) MySQL ソースインストールパ...

Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

序文比較的複雑な大規模システムでは、複雑なロジックで処理する必要があるオブジェクトまたはデータ フロ...

CSS グリッドレイアウトを使用してレスポンシブな縦棒グラフを作成する方法

私はしばらくの間チャートをいじっていましたが、好奇心から、CSS を使用してチャートを作成するより良...

InnoDB テーブルの BLOB 列と TEXT 列のストレージ効率を最適化します。

まず、MySQL InnoDB エンジンのストレージ形式に関する重要なポイントをいくつか紹介します。...

ZabbixはSNMPに基づいてLinuxホストを監視します

序文: Linux ホストは、エージェント プログラムをインストールする場合でも、SNMP を使用す...

...

React-Native環境のセットアップと基本的な紹介

環境の準備1. 環境構築React Native 中国語ウェブサイト2. 開発ツール フロントエンド...

Windows はリモート デスクトップが長時間自動的に切断されるのを防ぎます

Windows リモート デスクトップを使用してサーバーに接続したことがある人なら、リモート デスク...

MySQL truncate table ステートメントの使用

Truncate table ステートメントは、テーブル内のすべてのデータを削除/切り捨てるために使...

Ubuntu 16.04 で FTP サーバーを構築するチュートリアル

Ubuntu 16.04 FTP サーバーをビルドするftpをインストールするftp をインストール...

Vue.js でフォントを読み込む正しい方法

目次font-faceでフォントを正しく宣言するフォントをプリロードするフォントをホストするにはli...

MySQL の左結合操作における on 条件と where 条件の違いの紹介

優先度両方のケースで同じ条件を設定すると、異なる結果セットが生成される可能性があるのは、優先順位のた...

Tomcat 例外の解決方法 (リクエスト ターゲットに無効な文字が見つかりました。有効な文字は RFC 7230 および RFC 3986 で定義されています)

1. シナリオ表示Tomcat ログに次の例外情報が時々報告されます。何が起こっているのでしょうか...

Linux ネットワークプログラミングにおけるソケットオプションの実装

ソケットオプション機能機能: ソケットファイル記述子の属性の読み取りと設定に使用されるメソッド #i...

geo モジュールを使用して Nginx でホワイトリストを設定する例

元の構成: http { ...... limit_conn_zone $binary_remote...