MySQLで2つのSELECT文の結果差分を取得する方法(NOT INサブクエリの使い方)
MySQLで2つのSELECT結果の差分を求めるには
MySQLでは、サブクエリを利用することで、2つのSELECT文の結果セットの差分(一方にのみ存在するレコード)を簡単に取得できます。基本的な構文は以下の通りです。
SELECT * FROM yourTableName WHERE yourColumnName NOT IN (SELECT yourColumnName FROM yourTableName WHERE yourCondition);
この構文では、外側のSELECTの結果から、サブクエリが返す値に含まれないレコードだけを抽出します。それでは、実際にテーブルを作成して動きを確認してみましょう。
サンプルテーブルの作成
まず、以下のクエリでテーブルを作成します。
mysql> create table DifferenceSelectDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> UserId int,
-> UserValue int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.87 sec)テストデータの挿入
次に、INSERT文を使ってレコードを挿入していきます。
mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(10,10); Query OK, 1 row affected (0.24 sec) mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(10,20); Query OK, 1 row affected (0.15 sec) mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(20,30); Query OK, 1 row affected (0.17 sec) mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(20,20); Query OK, 1 row affected (0.19 sec) mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(30,40); Query OK, 1 row affected (0.14 sec) mysql> insert into DifferenceSelectDemo(UserId,UserValue) values(30,20); Query OK, 1 row affected (0.15 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみます。
mysql> select *from DifferenceSelectDemo;
実行結果は以下の通りです。
+----+--------+-----------+ | Id | UserId | UserValue | +----+--------+-----------+ | 1 | 10 | 10 | | 2 | 10 | 20 | | 3 | 20 | 30 | | 4 | 20 | 20 | | 5 | 30 | 40 | | 6 | 30 | 20 | +----+--------+-----------+ 6 rows in set (0.02 sec)
NOT INを使った差分取得クエリ
ここでは例として、「Id=1 のレコードのUserValue以外」をすべて抽出してみます。これにより、2つのSELECT結果の差分を取得できます。
mysql> select *from DifferenceSelectDemo
-> WHERE UserValue NOT IN (select UserValue from DifferenceSelectDemo where Id=1);実行結果は次のようになります。Id=1のレコード(UserValue=10)が除外され、残りの5件が返されているのがわかります。
+----+--------+-----------+ | Id | UserId | UserValue | +----+--------+-----------+ | 2 | 10 | 20 | | 3 | 20 | 30 | | 4 | 20 | 20 | | 5 | 30 | 40 | | 6 | 30 | 20 | +----+--------+-----------+ 5 rows in set (0.09 sec)
補足:NOT IN使用時の注意点
NOT INを使う際は、サブクエリの結果にNULLが含まれる場合に注意が必要です。NULLが1つでも含まれていると、比較結果が不定となり、意図した通りに行が返らなくなります。そのような場合は、LEFT JOIN ... IS NULL を使った方法や NOT EXISTS を使うと、より安全かつ大規模データでも高速に差分を取得できるためおすすめです。
-
MySQLで2つの日時(DATETIME)値の差を求める方法
MySQLで2つの日時値の差を求める方法MySQLで2つのDATETIME型の値の差を求めるには、TIMESTAMPDIFF()関数を使用します。この関数を使うことで、秒・分・時間などの任意の単位で2つの日時の差を簡単に計算できます。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> DueDatetime1 datetime, -> DueDatetime2 datetime -> );Query OK, 0 rows affected (0.86 sec)次に、INSE
-
C#で2つのDateTimeオブジェクト間の差をミリ秒単位で求める方法
C#では、TimeSpan構造体を使うことで、2つのDateTimeオブジェクト間の時間差を簡単に計算できます。この記事では、その差をミリ秒単位で取得する方法を解説します。基本的な手順まず、比較対象となる2つのDateTimeオブジェクトを用意します。以下は、同じ日付の時刻が異なる2つのオブジェクトの例です。DateTime date1 = new DateTime(2018, 8, 11, 08, 15, 20); DateTime date2 = new DateTime(2018, 8, 11, 11, 14, 25);次に、2つの日時の差を求めます。DateTime同士は減算演算子(-