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 をインストールする (グラフィック チュートリアル)

推薦する

Tomcat9 Windows サービスのインストールに関する詳細なチュートリアル

1. 準備1.1 service.bat を含む tomcat 圧縮パッケージをダウンロードします。...

mysql update文の実行プロセスの詳細な説明

以前、MySQL クエリ文の実行プロセスについての記事がありました。ここでは、更新文の実行プロセスを...

テキストエリア テキストエリアの幅と高さ 幅と高さの自動適応実装コード

コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...

MySQL 5.7.13 のインストールと設定方法の Mac でのグラフィック チュートリアル

MySQL 5.7.13 Mac用インストールチュートリアル、非常に詳細で、以下のように記録されてい...

MySQLでNULL値を判定する際の落とし穴事例

目次序文Mysql の case when 構文:事例実践:要約:序文今日、プログラムを開発している...

TypeScript を使用して Vue3 で axios をカプセル化する詳細な例

この axios パッケージは、vue3 デモで使用されます。便宜上、element-plus は ...

Linux sftp コマンドの使用法

SFTPの概念sftp は、安全なファイル転送プロトコルである Secure File Transf...

1 つの記事で Node.js の非同期プログラミングを学ぶ

目次 はじめに 同期 非同期とブロッキング JavaScript のノンブロッキング コールバック ...

WeChatアプレットタブの左右スライドスイッチ機能実装コード

効果画像: 1. はじめに独自のアプレットでこのような機能を実装する必要がある1. 核となる考え方ス...

Windows10 mysql 8.0.12 非インストール版 設定 起動方法

この記事では、MySQL 8.0.12のインストールされていないバージョンを設定して起動するための具...

Dockerのインストール、イメージの作成、NodeJSプログラムの読み込みと実行の詳細なプロセス

システム環境: Windows 7 1. DockerをインストールするDocker公式サイトからd...

モバイルレイアウト用の動的REMの実装

ダイナミックレム1. まず、現在の長さの単位を紹介しましょうpx em Mの幅 / 漢字の幅 1em...

Vueは小さなカウントダウン機能を実装します

多くのプロジェクトでは、検証コードの送信など、カウントダウン機能を実装する必要があります。ここで、簡...

Linux で JDK 環境を構成する方法

1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...

Virtualbox に Centos7 仮想マシンをインストールする詳細なグラフィック チュートリアル

1. Centos7をダウンロードするダウンロードアドレス: https://mirrors.tun...