MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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)を使えば直感的に記述できるのが魅力です。さらに条件が増える場合も、結合する別名テーブルを追加していくだけで柔軟に対応できます。ぜひ実際の開発でも活用してみてください。

  1. PowerToysでWindows 10/11をもっと便利に!無料ツールのダウンロードから使い方まで徹底解説

    PowerToysは、Windows 10およびWindows 11の操作を効率化し、生産性を高めることを目的とした無料ユーティリティ集です。PowerToysはWindows 95向けに初めて登場し、その後Windows XP向けに提供された後、現在はWindows 10と11向けのオープンソースプロジェクトとして公開されています。 PowerToysを使えば、ファイルの一括リネーム、画像の一括リサイズ、アプリのクイック起動など、さまざまな作業を素早く行えます。この記事では、PowerToysのダウンロード方法と、各ツールの使い方を詳しく解説します。 PowerToysとは? PowerTo

  2. VPNとは何か?初心者にもわかるVPNの基本と使うべき理由

    「VPN」という言葉を耳にしたことはあっても、実際に何をするものなのか、なぜ必要なのかを正しく理解している人は意外と少ないものです。この記事では、VPNの基本的な意味から、利用すべき理由、契約方法、そして避けるべき「無料VPN」の落とし穴まで、わかりやすく解説します。 この記事で解説する内容 VPNとは何か? VPNプロトコルの種類と違い おすすめのVPN対応ルーター VPNを使うべき理由 信頼できるVPNサービスの選び方 VPNとは何か? VPN(Virtual Private Network/仮想プライベートネットワーク)とは、インターネット上に暗号化された専用の通信経路を構築する