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

推薦する

フレックスレイアウトは、1行あたりの固定行数と適応レイアウトを実現します。

この記事では、1行あたりの固定行数+アダプティブレイアウトを実現するフレックスレイアウトを紹介し、皆...

mysql-8.0.17-winx64 のデプロイメント方法

1. 公式サイトからmysql-8.0.17-winx64をダウンロードし、Zipファイル形式を選択...

VMware 仮想マシンに固定 IP アドレスを設定する方法 (グラフィック チュートリアル)

1. メニューバーで「編集」→「仮想ネットワーク エディター」を選択して仮想ネットワーク エディタ...

JSの矢印関数におけるこのポイントの詳細な説明

矢印関数は ES6 の新機能です。独自の this はありません。その this ポイントは外部のコ...

MySql インデックスの詳細な紹介と正しい使用方法

MySql インデックスの詳細な紹介と正しい使用方法1. はじめに:インデックスはクエリ速度に重大な...

React Hooks の一般的な使用シナリオ (概要)

目次1. ステートフック1. 基本的な使い方2. 更新3. 合併を実現する4. 遅延初期化状態5. ...

小規模プロジェクトで Vue が点滅するのを防ぐ方法

まとめHTML: 要素と v-cloak CSS: [v-cloak]{表示: なし}プロセスページ...

Redis イメージの Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する落とし穴を避けるための注意MySQLコン...

pdf.js を使用して Vue で PDF ファイルをプレビューする方法

ページ上で PDF をプレビューすると、一部のファイルは印刷またはダウンロードできません。現時点では...

HTMLヘッダータグの使用に関する詳細な説明

HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...

MySQLの自己接続と結合の詳細な理解

1. MySQL 自己接続MySQL では、情報を照会するときに自分自身に接続 (自己接続) する必...

ウェブページ内の 2 つのボックス モデル (W3C ボックス モデル、IE ボックス モデル)

Web ページ ボックス モデルには 2 種類あります。 1: 標準 W3C ボックス モデル。2:...

Vueルータールーティングガードの詳細な説明

目次1. グローバル beforeEach 1. グローバル beforeEach 2. 実装2. ...

WeChatアプレットが弾丸画面を送信するビデオプレーヤーを実装

この記事では、WeChatアプレットでビデオプレーヤーの集中砲火を実装するための具体的なコードを参考...

複数の画像を切り替えるJavaScript

この記事では、複数の画像を切り替えるJavaScriptの具体的なコードを参考までに紹介します。具体...