前提条件
- 異なるサービスを組み合わせたサービスセットがある
- order_code、priceは取引先が指定
- service_set_relテーブルは考えられるパターンがほぼ網羅されている(パターンに重複はない)
- service_set_relテーブルは 数万件
実現したいこと
- 単品のサービスをいくつか選択し、サービスセットのorder_codeとpriceが特定できる効率的なSQL文が知りたいです。
- 1ヵ月分一括請求処理するので、数千回~数万回、下記SQLをループ処理する必要があります。
一応、動作しますが、Full Table Scanが入り、遅いようです。
これがベストなのか、他に良い方法があるのか、知りたいです。
services テーブル
id | name |
---|---|
1 | service1 |
2 | service2 |
3 | service3 |
4 | service4 |
5 | service5 |
6 | service6 |
service_set テーブル
id | set_name | order_code | price |
---|---|---|---|
1 | set1 | A001 | 456 |
2 | set2 | A002 | 200 |
3 | set3 | A003 | 700 |
4 | set4 | AF004 | 567 |
5 | set5 | B005 | 123 |
6 | set6 | A006 | 345 |
service_set_rel テーブル
set_id | service_id |
---|---|
1 | 2 |
1 | 3 |
1 | 4 |
2 | 1 |
2 | 4 |
3 | 4 |
3 | 2 |
3 | 1 |
3 | 3 |
4 | 4 |
4 | 3 |
4 | 2 |
試してみた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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/01 12:06