mysql の find_in_set 関数の基本的な使い方

mysql の find_in_set 関数の基本的な使い方

序文

これは私が最近見つけた新しい機能です。

プロジェクトでの私の使用シナリオは次のとおりです。

アプリケーション タイプ テーブルには、parentId フィールドと parentIds フィールドが含まれています。前者は親 ID で、後者は複数レベルの親 ID です。どちらもデータベース内では varchar 型です。parentIds は複数の親 ID で構成され、"" で区切られています。

チームリーダーからこの機能が使えると言われたので、実際に使ってみて勉強してみました。

文法

FIND_IN_SET(文字列、文字列リスト)

意味

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

strlist: 英語のカンマ「,」で連結された文字列。例:「a,b,c,d」。この文字列は、カンマで連結された SET 型の値に似ています。

例: SELECT FIND_IN_SET('b','a,b,c,d'); //戻り値は2で、これは2番目の値です


記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホットスポット、4 画像とテキストなどの記事タイプが格納されます。
見出しと話題の記事と写真とテキストが一体となった記事が、1,3,4の形式で保存されています。では、SQL を使用して、画像とテキストを含むタイプ 4 のすべての記事を検索するにはどうすればよいでしょうか?

ここで find_in_set が役に立ちます。引用内容は以下のとおりです。

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

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) の改良版

要約する

MySQL の find_in_set 関数の基本的な使い方についてはこれで終わりです。MySQL の find_in_set 関数の使い方についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  Centos7 でスーパーバイザ デーモンをインストールして設定する方法

>>:  Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

推薦する

Dockerはrabbitmqのサンプルコードをインストールして実行します

イメージをプルします: [mall@VM_0_7_centos ~]$ sudo docker pu...

MySQL Server 8.0.3 のインストールと設定方法のグラフィックチュートリアル

この文書はMySQL Server 8.0.3のインストールと設定方法を参考のために記録したものです...

Linux で ARM 開発ボード用のファイルシステムを作成する

1. Busyboxのソースコードをオンラインでダウンロードしてください。コンパイル方法については、...

HTMLのテーブルタグの基本学習チュートリアル

表ラベルの構成HTML 内の表は <table> タグで構成されており、ブラウザはタグを...

Dockerを使用して開発環境を構築する方法を素早く習得します

プラットフォームが成長し続けるにつれて、プロジェクトの研究開発は、開発者向けのさまざまな外部環境、特...

Vueナンバープレート入力コンポーネントの使い方の詳しい説明

参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...

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

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

Centos7 環境でバイナリ インストール パッケージから mysql5.6 をインストールする方法の詳細な説明

この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...

display または visibility を通じて HTML 要素を表示または非表示にする

場合によっては、特定の条件に基づいて Web ページ内の HTML 要素を表示するか非表示にするかを...

TypeScript デコレータ定義

目次1. コンセプト1.1 定義1.2 デコレータファクトリー1.3 デコレータの組み合わせ1.4 ...

MySQL 外部キー制約の詳細な説明

公式ドキュメント: https://dev.mysql.com/doc/refman/5.7/en/...

Linux システムで PATH 環境変数を設定する方法 (3 つの方法)

1. Windows システムでは、JDK のインストールなど、多くのソフトウェアのインストールで...

jQueryはフェードインとフェードアウト効果を実現します

jQuery を使用してフェードインとフェードアウト効果を完成させる前に、まずいくつかのコードを理解...

Vue-CLI3.xはプロジェクトをサーバーに自動的にデプロイします

目次序文1. scp2をインストールする2. テスト/本番環境サーバーのSSHリモートログインアカウ...

CSS3 で less のテキストの長い影を実装する

この記事では主に、CSS3 LESS で長いテキストの影を実装する方法を紹介し、皆さんと共有します。...