MySQLのMATCH...AGAINSTを使って特定のカラムに文字列を含む行を選択する方法
MySQLで特定のカラムに文字列を含む行を検索したい場合、FULLTEXTインデックスと MATCH() ... AGAINST() 構文を組み合わせることで、高速な全文検索が可能になります。ここでは、実際にテーブルを作成し、データを挿入して、MATCH...AGAINSTによる検索を行う手順を解説します。
1. テーブルの作成
まず、検索対象となるテーブルを作成します。
mysql> create table DemoTable1833
(
Name varchar(20)
);
Query OK, 0 rows affected (0.00 sec)2. FULLTEXTインデックスの追加
MATCH...AGAINSTを使用するには、対象カラムにFULLTEXTインデックスを作成する必要があります。ALTER TABLE文で追加しましょう。
mysql> alter table DemoTable1833 ADD FULLTEXT(Name); Query OK, 0 rows affected, 1 warning (0.00 sec) Records: 0 Duplicates: 0 Warnings: 1
3. レコードの挿入
INSERTコマンドを使って、テーブルにいくつかのレコードを挿入します。
mysql> insert into DemoTable1833 values('John Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1833 values('Adam Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1833 values('Chris Brown');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1833 values('John Smith');
Query OK, 1 row affected (0.00 sec)4. 登録されたレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1833;
以下のような出力が得られます。
+-------------+ | Name | +-------------+ | John Doe | | Adam Smith | | Chris Brown | | John Smith | +-------------+ 4 rows in set (0.00 sec)
5. MATCH...AGAINSTで行を検索する
それでは、特定のカラムに文字列を含む行を選択するクエリを実行します。「+」記号は必須キーワードを示すブールモードの演算子です。
mysql> select * from DemoTable1833 where MATCH(Name) AGAINST('+John Smith+');実行結果は以下の通りです。
+------------+ | Name | +------------+ | John Smith | | John Doe | | Adam Smith | +------------+ 3 rows in set (0.00 sec)
結果の解説
このクエリでは、「John」と「Smith」という単語をそれぞれ含む行がすべて取得されています。つまり、「John Smith」だけでなく「John Doe」(Johnを含む)や「Adam Smith」(Smithを含む)も該当しています。完全一致のフレーズで検索したい場合は、ダブルクォーテーションで囲んで AGAINST('"John Smith"') のように指定すると、「John Smith」という語順で両方の単語を含む行のみを抽出できます。
このように、MATCH...AGAINST構文とFULLTEXTインデックスを活用すれば、LIKE句を使った部分一致検索よりも効率的にテキスト検索を行うことができます。
-
MySQLでハイフン区切りの文字列値を1つの列から複数の列に分離して選択する方法
ハイフンで区切られた文字列値を1つの列から複数の列に分離して取得したい場合、MySQLの SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。ここでは、サンプルテーブルを使って具体的な手順を解説します。 サンプルテーブルの作成 まず、従業員情報を格納するテーブルを作成します。 mysql> create table DemoTable1962 ( EmployeeInformation text ); Query OK, 0 rows affected (0.00 sec) データの挿入 次に、INSERT文を使って「ID-名前-年齢」の形
-
MySQLで文字列や数値が混在するカラムから特定のレコードを取得する方法
文字列・数値・特殊文字が混在するカラムから特定のレコードを取得したい場合は、ORDER BY CAST() を活用すると便利です。この記事では、SUBSTRING() 関数と組み合わせて、「指定した文字列で始まるレコードの中から、数値部分が最も大きいもの」を抽出する方法を、実際のSQL例とともにわかりやすく解説します。 サンプルテーブルの作成 まず、CREATE TABLE文でテーブルを作成します。 mysql> create table DemoTable2006 ( UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, Us