MySQLでJOINとANDを組み合わせて複数条件に一致するレコードを選択する方法
MySQLでは、JOIN(結合)とAND演算子を組み合わせることで、「複数の条件をすべて満たすレコード」を抽出できます。本記事では、同じテーブル同士を結合する「自己結合」を活用し、「Apple(りんご)とBanana(バナナ)の両方が好きな人物」を検索する具体例を通じて、その手順をわかりやすく解説します。
デモ用テーブルの作成
まず、サンプルとして使用するテーブルを作成しましょう。以下のCREATE TABLE文を実行します。
mysql> create table selectPerson
-> (
-> PersonId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> PersonName varchar(20),
-> PersonFavouriteFruit varchar(60)
-> );
Query OK, 0 rows affected (0.58 sec)
サンプルデータの挿入
次に、INSERT文を使ってテーブルにレコードを挿入します。各人物に対して、好きな果物を複数件登録していきます。
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('John','Banana');
Query OK, 1 row affected (0.14 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('John','Blackberry');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('John','Blueberry');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Carol','Apple');
Query OK, 1 row affected (0.19 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Carol','Avocado');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Carol','Banana');
Query OK, 1 row affected (0.20 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Sam','Ackee');
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Sam','Apple');
Query OK, 1 row affected (0.89 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Sam','Apricots');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectPerson(PersonName,PersonFavouriteFruit) values('Sam','Banana');
Query OK, 1 row affected (0.27 sec)
テーブルの内容を確認する
SELECT文を実行して、すべてのレコードが正しく登録されているか確認しましょう。
mysql> select *from selectPerson;
実行結果は以下の通りです。
+----------+------------+----------------------+ | PersonId | PersonName | PersonFavouriteFruit | +----------+------------+----------------------+ | 1 | John | Banana | | 2 | John | Blackberry | | 3 | John | Blueberry | | 4 | Carol | Apple | | 5 | Carol | Avocado | | 6 | Carol | Banana | | 7 | Sam | Ackee | | 8 | Sam | Apple | | 9 | Sam | Apricots | | 10 | Sam | Banana | +----------+------------+----------------------+ 10 rows in set (0.00 sec)
JOINとANDで複数条件に一致するレコードを抽出する
ここからが本題です。「Apple」と「Banana」の両方が好きな人物を取得するには、同一テーブルを別名(エイリアス)で自己結合し、WHERE句の中でそれぞれ異なる条件をANDでつなげて指定します。
mysql> SELECT tbl1.PersonName -> FROM selectPerson tbl1 JOIN selectPerson tbl2 on tbl1.PersonName =tbl2.PersonName -> WHERE -> tbl1.PersonFavouriteFruit='Banana' -> and -> tbl2.PersonFavouriteFruit='Apple';
実行結果は以下の通りです。
+------------+ | PersonName | +------------+ | Carol | | Sam | +------------+ 2 rows in set (0.00 sec)
クエリの仕組みを解説
このクエリでは、selectPersonテーブルを「tbl1」と「tbl2」という2つの別名で自己結合しています。結合条件としてPersonNameの一致を指定することで、同じ人物に関する行同士が組み合わされます。そこへ「tbl1側はBananaが好き」「tbl2側はAppleが好き」という2つの条件をANDで課すことで、両方の果物を好きな人物だけが残ります。結果として、CarolとSamの2名が抽出されました。JohnはBananaは好きですがAppleのレコードがないため、対象外になっています。
まとめ
単一テーブル内で「AかつB」という複数条件を扱う場合、GROUP BYとHAVING COUNTを組み合わせる方法もありますが、自己結合(JOIN)を使えば直感的に記述できるのが魅力です。さらに条件が増える場合も、結合する別名テーブルを追加していくだけで柔軟に対応できます。ぜひ実際の開発でも活用してみてください。
-
PowerToysでWindows 10/11をもっと便利に!無料ツールのダウンロードから使い方まで徹底解説
PowerToysは、Windows 10およびWindows 11の操作を効率化し、生産性を高めることを目的とした無料ユーティリティ集です。PowerToysはWindows 95向けに初めて登場し、その後Windows XP向けに提供された後、現在はWindows 10と11向けのオープンソースプロジェクトとして公開されています。 PowerToysを使えば、ファイルの一括リネーム、画像の一括リサイズ、アプリのクイック起動など、さまざまな作業を素早く行えます。この記事では、PowerToysのダウンロード方法と、各ツールの使い方を詳しく解説します。 PowerToysとは? PowerTo
-
VPNとは何か?初心者にもわかるVPNの基本と使うべき理由
「VPN」という言葉を耳にしたことはあっても、実際に何をするものなのか、なぜ必要なのかを正しく理解している人は意外と少ないものです。この記事では、VPNの基本的な意味から、利用すべき理由、契約方法、そして避けるべき「無料VPN」の落とし穴まで、わかりやすく解説します。 この記事で解説する内容 VPNとは何か? VPNプロトコルの種類と違い おすすめのVPN対応ルーター VPNを使うべき理由 信頼できるVPNサービスの選び方 VPNとは何か? VPN(Virtual Private Network/仮想プライベートネットワーク)とは、インターネット上に暗号化された専用の通信経路を構築する