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

推薦する

Elasticsearch を使用する際の一般的な問題の解決策

1. redis で使用すると Netty の起動競合が発生するため、***Application ...

WeChatアプレットでのwxsファイルの素晴らしい使い方をいくつか紹介します

目次序文応用フィルタードラッグファイル間での参照の受け渡しwxsはjsロジック層にパラメータを渡しま...

ニューススタイルのウェブサイトデザイン例25選

bmi ボイジャーピッチフォークアルスター食料品店チャウ真/斜めポスタこれは偽のDIYですクリエイテ...

Vue3のサンドボックスの仕組みの詳しい説明

目次序文ブラウザコンパイル版ローカルプリコンパイルバージョン要約する序文vue3サンドボックスには主...

JavaScript プロトタイプとプロトタイプチェーンの詳細

目次1. プロトタイプ(明示的なプロトタイプ) 2. __proto__ (暗黙のプロトタイプ) 3...

CSS3 フィルターの違いと応用の詳しい説明:ドロップシャドウフィルターとボックスシャドウ

標準 CSS3 を使用して要素の影の効果を実現するには、2 つの手順があります。1 つ目は一般的なb...

Alibaba Cloud Server ドメイン名解決手順 (初心者向けチュートリアル)

ウェブサイトの構築を始めたばかりの初心者には、理解し、学ぶべきことがたくさんあります。ウェブサイトを...

CSS3 テキストシャドウ text-shadow プロパティの詳細な説明

テキストシャドウ text-shadow プロパティの効果: 1. 右下隅の影、左下隅の影、左上隅の...

Vue3ルーティングVueRouter4を使用する簡単な例

ルーティングvue-router4 では API の大部分は変更されていないため、変更点のみに焦点を...

vue ルーティング ビュー router-view のネストされたジャンプの実装

目次1. app.vueページを修正する2. ログインページを作成する (/views/login/...

WeChatアプレット開発の章:落とし穴の記録

最近、会社初のミニプログラムの開発に参加しました。開発経験は基本的にWebViewをベースとしたハイ...

Vue でよく使われる高階関数と包括的な例

1. 配列のよく使われる高階関数配列があり、その配列に対して次の操作を実行したいとします。 100 ...

Quickjs は JavaScript サンドボックスの詳細をカプセル化します

目次1. シナリオ2. 基盤となるAPIを簡素化する2.1 自動的に破棄を呼び出す2.2 VM値を作...

Vueは物流タイムライン効果を実現します

この記事では、物流タイムライン効果を実現するためのVueの具体的なコードを例として紹介します。具体的...