MySQL での find_in_set() 関数の使用に関する詳細な説明

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。

記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホットスポット、4 画像とテキストなどの記事タイプが格納されます。

見出しと話題の記事と写真とテキストが一体となった記事が、1,3,4の形式で保存されています。では、SQL を使用して、画像とテキストを含むタイプ 4 のすべての記事を検索するにはどうすればよいでしょうか? ?

ここで find_in_set が登場します。引用内容は以下のとおりです。

FIND_IN_SET('4',type) で記事から * を選択

----------------------------------------------------------

MySQL マニュアルの find_in_set 関数の構文:

FIND_IN_SET(str,strlist)

str 検索する文字列

strlistフィールド名パラメータは「,」で区切られます(例:(1,2,6,8))

フィールド(strlist)に(str)を含む結果を照会し、結果をnullまたはレコードとして返します。

文字列 str が N 個の部分文字列で構成される文字列リスト strlist 内にある場合、戻り値の範囲は 1 から N になります。 文字列リストは、「,」文字で区切られた部分文字列で構成される文字列です。最初の引数が定数文字列で、2 番目の引数が SET 型の列である場合、FIND_IN_SET() 関数はビット演算を使用するように最適化されます。 str が strlist にない場合、または strlist が空の文字列の場合、戻り値は 0 になります。いずれかのパラメータが NULL の場合、戻り値は NULL になります。最初の引数にカンマ (',') が含まれている場合、この関数は正しく機能しません。

--------------------------------------------------------

例:

mysql> FIND_IN_SET('b', 'a,b,c,d') を選択します。 
-> 2 b は strlist セットの 2 番目の位置に配置され、1 から始まるため、select FIND_IN_SET('1', '1'); 戻り値は 1 です。このときの strlist セットは少し特殊です。文字列は 1 つだけです。実際、0 より大きい数値を返すには、前の文字列が次の文字列セットに含まれている必要があります。select FIND_IN_SET('2', '1,2'); 2 を返します。 
FIND_IN_SET('6', '1') を選択すると 0 が返されます

--------------------------------------------------------

知らせ:

FIND_IN_SET(id, '1,2,3,4,5') の treenodes から * を選択します。

find_in_set関数を使用して、複数のレコードを一度に返します。idはテーブルのフィールドであり、各レコードのidは1、2、3、4、5です。これは、in (set)に少し似ています。

IDが(1,2,3,4,5)のツリーノードから*を選択します。

--------------------------------------------------------

find_in_set() と in の違い:

2つの違いを示すテストテーブルを作成する

テーブル `tb_test` を作成します (
 `id` int(8) NOT NULL auto_increment,
 `name` varchar(255) NOT NULL,
 `list` varchar(255) NOT NULL,
 主キー (`id`)
);
`tb_test` に VALUES (1, 'name', 'daodao,xiaohu,xiaoqin') を挿入します。
`tb_test` に値 (2、'name2'、'xiaohu、daodao、xiaoqin') を挿入します。
`tb_test` に値 (3、'name3'、'xiaoqin、daodao、xiaohu') を挿入します。

当初、MySQL は次のようなクエリを実行できると考えていました。

tb_test から id、name、list を選択 WHERE 'daodao' IN(list); -- (I) 

実際には、これは機能しません。クエリは、リスト フィールドの値が 'daodao' と等しい (IN の前の文字列と完全に一致する) 場合にのみ有効です。それ以外の場合は、'daodao' が実際にリストにあっても結果は取得されません。

これを見てみましょう:

tb_test から id、name、list を選択 WHERE 'daodao' IN ('libk', 'zyfon', 'daodao'); -- (II) 

それはいいです。

これら2つの違いは何ですか?なぜ最初の方法では正しい結果が得られないのに、2 番目の方法では正しい結果が得られるのでしょうか。その理由は、(1)の(list)リストは変数であるのに対し、(2)の('libk'、'zyfon'、'daodao')は定数だからです。

したがって、(1)を正しく動作させたい場合は、find_in_set()を使用する必要があります。

SELECT id,name,list from tb_test WHERE FIND_IN_SET('daodao',list); -- (I) の改良版

要約:

したがって、リストが定数の場合は IN を直接使用できますが、それ以外の場合は find_in_set() 関数を使用する必要があります。

--------------------------------------------------------

find_in_set() と次のような違いがあります。

MySQL では、データベースクエリを実行するときに、特定のフィールドに特定の値を含むレコードを取得する必要があることがありますが、LIKE を使用しても解決できません。LIKE を使用すると、不要なレコードが見つかる場合があります。LIKE よりも正確です。このような場合、MySQL の FIND_IN_SET 関数が役立ちます。例を見てみましょう。

テーブルを作成し、ステートメントを挿入します。

テーブルユーザーの作成(
  id int(6) NOT NULL AUTO_INCREMENT、
  名前 VARCHAR(20) NOT NULL,
  制限 VARCHAR(50) NOT NULL, -- 権限 PRIMARY KEY (id)
);
ユーザーにINSERT INTO(名前、制限) VALUES('Xiao Zhang','1,2,12'); 
ユーザーにINSERT INTO(名前、制限) VALUES('Xiao Wang','11,22,32');

このうち、limits はユーザーが持つ権限を示します (カンマで区切られます)。ここで、権限番号 2 のユーザーをクエリします。like キーワードを使用すると、クエリ結果は次のようになります。

SELECT * FROM users WHERE limits LIKE '%2%'; 

この方法では、権限「2」を持たないユーザーの 2 番目のデータも見つかりますが、これは予想どおりではありません。以下では、MySQL 関数 find_in_set() を使用して問題を解決します。

SELECT * FROM users WHERE FIND_IN_SET(2,limits); 

この方法で、望ましい効果が得られ、問題は解決されます。

注意: MySQL 文字列関数find_in_set(str1,str2) str2 内の str1 の位置のインデックスを返します。str2 は "," で区切る必要があります。

概要: LIKE は広範囲のあいまい一致であり、文字列に区切り文字はありません。Find_IN_SET は完全一致であり、フィールド値は英語の「,」で区切られており、Find_IN_SET クエリの結果は LIKE クエリの結果よりも小さくなります。

要約する

上記は、編集者が紹介したMySQLのfind_in_set()関数の使い方の詳細な説明です。皆様のお役に立てれば幸いです。ご質問がございましたら、メッセージを残していただければ、編集者がすぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • mysql での find_in_set() 関数と in() の使用に関する詳細な説明
  • MySQL FIND_IN_SET関数の使い方
  • MySQL の組み込み関数 find_in_set を使用した効率的なあいまい検索の詳細な説明
  • MySQLは、where in()順序ソートを実装するためにfind_in_set()関数を使用します。
  • mysql の find_in_set 関数の基本的な使い方

<<:  Django+vue 登録とログインのサンプルコード

>>:  Linux で PHP curl 拡張機能をインストールする方法の詳細な説明

推薦する

航空機戦争ゲームを実装するためのJavaScript

この記事では、キャンバスとjsを使用して簡単な飛行機戦争を実装する方法を参考までに紹介します。具体的...

他の人が私のウェブページを保存したり、サイトをコピーしたりするのを防ぐためのヒント

現在、インターネット上でウェブサイトをコピーすることは非常に一般的です。では、他人が私たちのウェブサ...

mysql.data.dll ドライバーのさまざまなバージョンの簡単な分析

ここにmysqlドライバmysql.data.dllがあります知らせ:ここではX86バージョンが多く...

入力テキストボックスの入力実装プロパティを無効にする

今日は、開発でよく使われる、非常に便利な HTML タグをいくつかまとめてみたいと思います。これらの...

MySQLデータベースに中国語の文字を保存するときに発生するエラーを解決する方法を教えます

目次1. 遭遇した問題2. 問題を分析する3. 本当の問題4. 解決策5. ソリューション効果1. ...

js+ca​​nvas でコードレイン効果を実現

この記事では、js+ca​​nvasコードの雨効果の具体的なコードを参考までに共有します。具体的な内...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

node.js チュートリアルの Util モジュールの例の詳細な説明

目次タイプ判定から始める厳格な平等エラーファーストと約束デバッグと出力タイプ判定から始めるJavaS...

JS 9 Promise 面接の質問

目次1. 複数の .catch 2. 複数の .catch 3. .then と .catch の連...

忘れられたボタンタグ

注:この記事は他の人によって翻訳されていますが、考えるべき点が多く、理解しにくい点もあると感じていま...

画像を表示したり非表示にしたりするための JavaScript

JavaScriptは画像を表示したり非表示にしたりしますが、参考までに具体的な内容は次のとおりで...

Ubuntu インストール cuda10.1 ドライバ実装手順

1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...

RedHat 6.5/CentOS 6.5 に MySQL 5.7.20 をインストールするための詳細なチュートリアル

rpmインストールパッケージをダウンロードするMySQL公式サイト: https://dev.mys...

MySQL自動シャットダウン問題への対処の実践記録

最近、あるプロジェクトを手伝ったのですが、MySQL マシンがしばらくすると自動的に停止し続けました...