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

推薦する

mysql-5.7.21-winx64 無料インストール版のインストール - Windows チュートリアル詳細説明

1 ダウンロードアドレスは https://dev.mysql.com/downloads/mysq...

MySQLがブール型を返すいくつかの状況について簡単に説明します。

mysqlはブール型を返します最初のケースでは、直接戻ります select id='22a...

docker に基づいて nginxssl 設定を開始する

前提条件クラウドサーバー(Alibaba Cloud、Tencent CloudなどのcentOS)...

ブラウザのCSS、JavaScript、背景画像のキャッシュをクリアする簡単な方法

実際のプロジェクト開発プロセスでは、ページがサーバーにアップロードされます。サーバーへの負荷を軽減し...

MySQL 8.0.12 winx64 詳細なインストールチュートリアル

この記事では、MySQL 8.0.12のインストールチュートリアルを参考までに紹介します。具体的な内...

docker を使用して kafka プロジェクトをデプロイする Centos6 方法の分析

この記事では、Docker を使用して Centos6 に Kafka プロジェクトをデプロイする方...

Linux で PHP を 5.6 にアップグレードする実用的な方法

1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...

Vue-router は現在の場所 (/path) へのナビゲーションを許可しません。エラーの原因と修正

目次エラーメッセージ原因エラーのデモンストレーション回避策方法1方法2方法3エラーメッセージ現在の場...

CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

【コンテンツ】: 1.背景画像のグラデーションスタイルを使用する2. スケールを使ってズームできる...

Centos 7.4 サーバーの時刻同期設定方法 [NTP サービスに基づく]

この記事では、CentOS 7.4 サーバーで時刻同期を構成する方法について説明します。ご参考までに...

Linux で MySQL のデフォルト エンコーディングを変更する方法

開発プロセス中に、MySQL データベースを復元した後にデータベース データに文字化けが発生した場合...

DockerはホストのMysql操作に接続します

今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...

W3Cチュートリアル(16):その他のW3Cの活動

このセクションでは、その他の重要かつ興味深い W3C アクティビティの概要を説明します。このセクショ...

openlayers6のマップオーバーレイの詳細な説明

1. オーバーレイの概要オーバーレイとは、その名の通り、別の形で地図上に表示される、覆うことを指しま...

Vue2.x プロジェクトのパフォーマンス最適化のためのコード最適化の実装

目次1 v-ifとv-showの使用2. 計算と監視を区別する3 v-for トラバーサルでは、アイ...