質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

解決済

【SQL】【SELECT】テーブル内のレコードの異なるカラムのフィールド値を比較して一致するデータを抽出したい

ShiraPi
ShiraPi

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

4回答

0評価

1クリップ

821閲覧

投稿2021/12/09 07:59

編集2021/12/09 08:10

前提・実現したいこと

SQLのデータ抽出についての質問です。
同テーブル内のレコードの内、同じカラムのフィールド値が一致するかつ異なるカラムのフィールドの値が一致するレコードを全て抽出したいです。
上記内容をテーブルから取得できるクエリをご教授いただけないでしょうか。

データの取得条件

「CONCAT(test.name1, test.name2)が一致するレコード」
かつ
「CONCAT(test.h_phone1, test.h_phone2, test.h_phone3) とCONCAT(test.m_phone1, test.m_phone2, test.m_phone3)の組み合わせで一致するレコード」

環境

OS:CentOS7
DB:MySQL5.7

※前提としてテーブルには10万件ちかいレコードが入っています。

試したこと・発生している問題

実際にした事としては、サブクエリでテーブル内のレコードを全件取得した後にWHERE句で条件で絞り込む方法です。
テーブルが100件ほどであれば時間がかかる事なく問題なく取得できましたが、
10万件近いデータで試したところパフォーマンスが悪くタイムアウトエラーが発生してしましました。
目安としては10分以内で結果を取得できるクエリが望ましいです。

テーブルのデータ構造

testテーブル
| id | name_1 | name2 | h_phone1 | h_phone2 | h_phone3 | m_phone1 | m_phone2 | m_phone3 |
| ---- | ---- |
| 1 | 佐藤 | 太郎 | 000 | 1111 | 2222 | 000 | 3333 | 4444 |
| 2 | 佐藤 | 太郎 | 000 | 1111 | 2222 | 000 | 1111 | 2222 |
| 3 | 佐藤 | 太郎 | 000 | 3333 | 4444 | 000 | 3333 | 4444 |
| 4 | 佐藤 | 次郎 | 000 | 1111 | 2222 | 000 | 1111 | 2222 |
| 5 | 佐藤 | 三郎 | 000 | 1111 | 2222 | 000 | 3333 | 4444 |

実際に発行したクエリ

SELECT main_test.id, CONCAT(main_test.name1, main_test.name2) AS main_name, CONCAT(sub_test.name1, sub_test.name2) AS sub_name, CONCAT( main_test.h_phone1, main_test.h_phone2, main_test.h_phone3 ) AS main_h_phone, CONCAT( sub_test.m_phone1, sub_test.m_phone2, sub_test.m_phone3 ) AS sub_m_phone, CONCAT( sub_test.h_phone1, sub_test.h_phone2, sub_test.h_phone3 ) AS sub_h_phone, CONCAT( main_test.m_phone1, main_test.m_phone2, main_test.m_phone3 ) AS main_m_phone FROM test AS main_test, ( SELECT test.name1, test.name2, test.h_phone1, test.h_phone2, test.h_phone3, test.m_phone1, test.m_phone2, test.m_phone3 FROM test WHERE -- 「h_phoneが全てNULL・空ではない」もしくは「m_phoneが全てNULL・空ではない」 ( ( ( test.h_phone1 IS NOT NULL AND test.h_phone2 IS NOT NULL AND test.h_phone3 IS NOT NULL ) AND ( test.h_phone1 != "" AND test.h_phone2 != "" AND test.h_phone3 != "" ) ) OR ( ( test.m_phone1 IS NOT NULL AND test.m_phone2 IS NOT NULL AND test.m_phone3 IS NOT NULL ) AND ( test.m_phone1 != "" AND test.m_phone2 != "" AND test.m_phone3 != "" ) ) ) ) AS sub_test WHERE -- 「main_h_phone、sub_m_phone」もしくは「sub_h_phoneとmain_m_phone」の組み合わせ CONCAT(main_test.name1, main_test.name2) = CONCAT(sub_test.name1, sub_test.name2) AND ( ( CONCAT( main_test.h_phone1, main_test.h_phone2, main_test.h_phone3 ) = CONCAT( sub_test.m_phone1, sub_test.m_phone2, sub_test.m_phone3 ) ) OR ( CONCAT( sub_test.h_phone1, sub_test.h_phone2, sub_test.h_phone3 ) = CONCAT( main_test.m_phone1, main_test.m_phone2, main_test.m_phone3 ) ) )

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

takanaweb5

2021/12/09 08:33

サンプルデータに対して欲しい結果はどうなるのでしょうか?
ShiraPi

2021/12/09 10:46

コメントありがとうございます。 欲しい結果としては、「名前が同じで自宅電話番号と携帯電話番号の組み合わせでどちらか片方が一致したデータ」です。 よろしくお願いします。 「名前と名前が一致している」かつ「自宅電話番号と携帯電話番号の組み合わせ2つの内どちらか片方が一致している」レコードです。 ※自宅電話番号と携帯電話番号の組み合わせのパターンとしては、「自宅電話番号×携帯電話番号が一致しているか」「携帯電話番号×自宅電話番号が一致しているか」の2つあります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます