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

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

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

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

Q&A

解決済

1回答

320閲覧

子レコードをすべて含み、余分な子レコードを含まない、親レコードを特定するSQL

tomo-oniichan

総合スコア5

MySQL

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

0グッド

0クリップ

投稿2022/12/01 06:42

前提条件

  • 異なるサービスを組み合わせたサービスセットがある
  • order_code、priceは取引先が指定
  • service_set_relテーブルは考えられるパターンがほぼ網羅されている(パターンに重複はない)
  • service_set_relテーブルは 数万件

実現したいこと

  • 単品のサービスをいくつか選択し、サービスセットのorder_codeとpriceが特定できる効率的なSQL文が知りたいです。
  • 1ヵ月分一括請求処理するので、数千回~数万回、下記SQLをループ処理する必要があります。

一応、動作しますが、Full Table Scanが入り、遅いようです。
これがベストなのか、他に良い方法があるのか、知りたいです。

services テーブル

idname
1service1
2service2
3service3
4service4
5service5
6service6

service_set テーブル

idset_nameorder_codeprice
1set1A001456
2set2A002200
3set3A003700
4set4AF004567
5set5B005123
6set6A006345

service_set_rel テーブル

set_idservice_id
12
13
14
21
24
34
32
31
33
44
43
42

試してみたSQL

例: service_id 4,2,3 を3つ含む、service_setを特定する場合

SQL

1SELECT order_code,price 2FROM service_set AS s_set 3WHERE 4 s_set.id IN (SELECT set_id FROM service_set_rel WHERE service_id IN (4, 2, 3)) 5 AND s_set.id NOT IN (SELECT set_id FROM service_set_rel WHERE service_id NOT IN (4, 2, 3)) 6 AND s_set.id IN (SELECT set_id FROM service_set_rel GROUP BY set_id HAVING COUNT(service_id) = 3)

補足情報(FW/ツールのバージョンなど)

MySQL 8.0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

何回も引くというなら、service_set_rel をgroup_concatした中間テーブルを作るとか。

SQL

1create temporary table foo 2select group_concat( service_id order by service_id) as service_ids,set_id 3from service_set_rel group by set_id

service_idsにindex貼って、where service_ids=‘2,3,4’で引く。
あんまりservice_idsが長くなる(1024文字だから、10桁idが100個あるとか)ようだと問題になるけど、、

投稿2022/12/01 08:13

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomo-oniichan

2022/12/01 12:06

ありがとうございます。 テーブル自体の更新頻度が少なく、selectすることの方が多いので、今回はservice_idsを作成しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問