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 拡張機能をインストールする方法の詳細な説明

推薦する

kindとDockerを使用してローカルKubernetes環境を起動する

導入Kubernetes を使い始めるのに丸一日を費やしたことはありませんか?最近登場したいくつかの...

CSS 透明ボーダー背景クリップマジック

この記事では、CSSの透明な境界線の背景クリップの素晴らしい使い方を主に紹介し、みんなと共有し、自分...

HTML テーブルタグチュートリアル (35): 列間属性 COLSPAN

複雑なテーブル構造では、一部のセルが垂直方向に複数のセルにまたがるため、列間属性 COLSPAN を...

Windows で MySQL 5.7.17 圧縮バージョンをインストールするときに遭遇する落とし穴

まず、Windows 64 ビット用の最新の MySQL 5.7.17 コミュニティ圧縮バージョンを...

Markodwnによるタイトル配置による同期スクロールのアイデアの詳細な説明

序文私が作成中の Markodwn エディターに同期スクロール機能を追加する必要があります。Baid...

JavaScript WebAPI、DOM、イベント、操作要素例の詳しい説明

目次ウェブAPI DOM DOMツリーDOM要素取得方法ドキュメントオブジェクトのプロパティイベント...

TypeScriptジェネリックの使用

目次1. 使いやすい2. 関数内でジェネリックを使用する3. クラス内でジェネリックを使用する4. ...

Vue2とVue3のライフサイクルの比較の詳細な理解

目次サイクル比較使用法要約するサイクル比較ヴュー2ヴュー3作成前設定作成された設定マウント前マウント...

Zabbix カスタム監視 nginx ステータス実装プロセス

目次Zabbix カスタム監視 nginx ステータス1. ステータスインターフェースを開く2. 監...

Vueログイン機能の実装

目次前面に書かれたログインの概要ログインビジネスプロセスログインサービスの関連技術ポイントログイント...

Centos7 に yum 経由で MySQL をインストールする方法

1. MySQLがインストールされているかどうかを確認する yum インストール済みリスト | gr...

Vue lazyload 画像遅延読み込み例の詳細な説明

ドキュメント: https://github.com/hilongjw/vue-lazyload 1...

jsはショッピングサイトの虫眼鏡機能を実現します

この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...

...