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

推薦する

ESXI の仮想マシンにワークステーションをインストールするときに発生するネットワーク障害の解決策

問題の説明ESXI で Windows にワークステーションをインストールした後、内部の仮想マシンは...

Linux mysql5.5 を mysql5.7 にアップグレードする手順と落とし穴

目次Linux MySQL 5.5 が MySQL 5.7 にアップグレードされました1. mysq...

両端揃えレイアウトを実現する CSS 列のサンプルコード

1. 堂々巡りいろいろ試行錯誤した結果、均等割り付けレイアウトを実現する最も簡単な方法は CSS ...

CSS で複数の境界線を実装するためのヒント

1. 複数の国境[1]背景: ボックスシャドウ、アウトライン使用シナリオの多様性を考慮すると、複数の...

dockerfile-maven-plugin 使用ガイドの概要

目次pom 構成Setting.xml 構成ログインステータスログインが必要ですログインは必要ありま...

Tomcat のパフォーマンス最適化のための Apr モジュールの構築方法

序文Tomcat は、無数のチューニング オプションを備えた、広く使用されている Java Web ...

Docker Desktop で rocketmq をインストールするための非常に詳細なチュートリアル

Dockerデスクトップをインストールするダウンロード先: Docker Desktop for M...

Nginx ロードバランシングの設定方法

目次Nginx 負荷分散構成Nginx 負荷分散戦略ポーリング(デフォルト)重さip_ハッシュ公正(...

リンクをクリックしたときに表示される点線のボックスを削除するいくつかの方法

削除する方法はいくつかあります:リンクを直接追加するonfocus="this.blur(...

React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

1. Reactでクラス宣言する際のヒント 上記のように、Child クラスは class キーワー...

HTML iframe と frameset の違い_PowerNode Java Academy

導入1.<iframe> タグ: iframe は、ページ内に内部フレームを生成するイン...

HTMLポップアップdivはモバイルの中央揃えを実現するのに非常に便利です

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

ウェブデザインのためのロイヤルブルーのカラーマッチング入門

古典的な色の組み合わせは力と権威を伝え、強いロイヤルブルーはあらゆる古典的な色の組み合わせの中心的な...