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

MySQLでJOINを使用して相互関係のある行をカウントするクエリの書き方

MySQLで、ある値が2つの列に相互関係を持って存在する行(例えば「90」がValue1とValue2の両方に関わる行)をカウントしたい場合、集計関数 COUNT(*) と自己結合(JOIN)を組み合わせることで実現できます。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable1543
    -> (
    -> Value1 int,
    -> Value2 int
    -> );
Query OK, 0 rows affected (1.36 sec)

レコードの挿入

次に、INSERT文を使ってテーブルにデータを登録します。

mysql> insert into DemoTable1543 values(57,60);
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable1543 values(60,68);
Query OK, 1 row affected (0.38 sec)
mysql> insert into DemoTable1543 values(90,98);
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable1543 values(98,90);
Query OK, 1 row affected (0.20 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1543;

実行結果は以下の通りです。

+--------+--------+
| Value1 | Value2 |
+--------+--------+
|     57 |     60 |
|     60 |     68 |
|     90 |     98 |
|     98 |     90 |
+--------+--------+
4 rows in set (0.00 sec)

相互関係のある行をカウントするクエリ

ここからが本題です。同じテーブルに対して別名(tbl1、tbl2)を付けて自己結合を行い、「tbl1.Value2 = tbl2.Value1」という条件で関連付けます。さらにWHERE句で「tbl1.Value1 = 90」かつ「tbl2.Value2 = 90」と指定することで、数値90が両列にまたがって相互関係を持つ行だけを抽出し、その件数をカウントします。

mysql> select count(*) from DemoTable1543 tbl1
    -> join DemoTable1543 tbl2
    -> on tbl1.Value2=tbl2.Value1
    -> where tbl1.Value1=90 and tbl2.Value2=90;

実行結果は以下の通りです。

+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

クエリのポイント

  • 自己結合(SELF JOIN):同一テーブルに異なる別名を付けることで、あたかも2つのテーブルがあるかのように扱えます。
  • 結合条件:「tbl1.Value2 = tbl2.Value1」により、片方の行のValue2がもう片方の行のValue1と一致する組み合わせのみを取得します。
  • 絞り込み条件:WHERE句で両端の値を指定することで、目的の相互関係(この例では90)を持つペアだけに限定できます。

この手法は、グラフ構造のエッジ(辺)の有向ペアを検索したり、双方向の参照関係を持つデータを検証したりする際にも応用できる便利なパターンです。

  1. MySQLクエリでCASE条件を使ってカウントする方法

    MySQLでは、CASE WHENを活用し、COUNT()関数の中にCASE条件を設定することで、特定の条件に一致するレコードだけを数えることができます。この仕組みが成り立つのは、COUNT()関数がNULL値を無視するためです。条件に合わない場合にNULLを返すことで、そのレコードはカウント対象から除外されます。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。 ); Query OK, 0 rows affected (0.61 sec)2. レコードの挿入続いて、insertコマンドを使ってテーブルにデータを登録します。mysql> insert into D

  2. ApacheとMySQLを連携させる方法|ユーザー認証とログ管理の基本

    ApacheとMySQLの連携とは本記事では、Webサーバー「Apache」とデータベース「MySQL」を組み合わせて活用する方法を解説します。Apacheは、Apache Software Foundationによって開発・保守されているWebサーバーソフトウェアです。ユーザーからWebページへのアクセス要求(リクエスト)を受け付け、いくつかのセキュリティチェックを実施したうえで、目的のページへとユーザーを誘導します。MySQLによるユーザー認証MySQLデータベースを使ってユーザー認証を行えるプログラムは数多く存在します。これらのプログラムを利用すれば、アクセスログをMySQLのテーブルに