前提条件
- 異なるサービスを組み合わせたサービスセットがある
- 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