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

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

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

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

解決済

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

tomo-oniichan
tomo-oniichan

総合スコア5

MySQL

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

1回答

0グッド

0クリップ

142閲覧

投稿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

以下のような質問にはグッドを送りましょう

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

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

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア1425

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

tomo-oniichan

2022/12/01 12:06

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

MySQL

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