質問があるのですが、
以下のSQLはどのような書き方にすればもっとよくなるでしょうか?
ちなみにORマッパーはDomaを使っています
要件は以下です。
「ログインユーザーが所属する店舗(store_mst)あるいは、そのチェーン店(groupstore_mst)に紐づく商品分類タグ(tag_mst)で、その商品分類タグのWEB表示(tag_mst.display_flg = 1)件数が合わせて5件を超える店舗IDを取得する」
スキーマ構成としては以下です。
商品分類タグマスタ(tag_mst) ・tag_id(PK) ・store_id ・groupstore_id ・display_flg 店舗マスタ(store_mst) ・store_id(PK) ・groupstore_id ・store_name チェーン店マスタ(groupstore_mst) ・groupstore_id(PK) ・groupstore_name
今SQLで以下ようなクエリを作成しています。Domaの書き方になっています。引数はログインユーザーのstoreIdです。
SQL
1SELECT 2 T5.store_id 3FROM 4 ( 5 SELECT 6 T1.store_id, 7 ( 8 SELECT COUNT(*) 9 FROM 10 tag_mst T2 11 WHERE 12 T2.store_id = T1.store_id AND T2.display_flg = 1 13 GROUP BY 14 T2.store_id 15 ) +( 16 SELECT COUNT(*) 17 FROM 18 tag_mst T3 19 WHERE 20 T3.groupstore_id =( 21 SELECT 22 T4.groupstore_id 23 FROM 24 store_mst T4 25 WHERE 26 T4.store_id = T1.store_id 27 ) AND T3.display_flg = 1 28) AS cnt 29FROM 30 tag_mst T1 31WHERE 32 store_id = /*storeId*/101 33GROUP BY 34 T1.store_id 35) T5 36WHERE 37 cnt > 5 38
もう少し良い書き方がしたいのですが、アドバイス頂けないでしょうか?
よろしくお願い致します。
補足
sql
1CREATE TABLE `tag_mst` ( 2 `tag_id` int(11) NOT NULL, 3 `store_id` int(11) DEFAULT NULL, 4 `groupstore_id` int(11) DEFAULT NULL, 5 `display_flg` int(11) DEFAULT 0 6) ENGINE=InnoDB DEFAULT CHARSET=latin1; 7 8CREATE TABLE `store_mst` ( 9 `store_id` int(11) NOT NULL, 10 `groupstore_id` int(11) DEFAULT NULL, 11 `store_name` text 12) ENGINE=InnoDB DEFAULT CHARSET=latin1; 13 14 15INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('1', '101', NULL, '1'); 16INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('2', '101', NULL, '1'); 17INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('3', '101', NULL, '1'); 18INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('4', '101', NULL, '1'); 19INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('5', '101', NULL, '1'); 20INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('6', '101', NULL, '1'); 21INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('11', NULL, '201', '1'); 22INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('12', NULL, '201', '1'); 23INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('13', NULL, '201', '1'); 24INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('14', NULL, '201', '1'); 25INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('15', NULL, '201', '1'); 26INSERT INTO `tag_mst` (`tag_id`, `store_id`, `groupstore_id`, `display_flg`) VALUES ('16', NULL, '201', '1'); 27 28INSERT INTO `store_mst` (`store_id`, `groupstore_id`, `store_name`) VALUES ('101', '201', 'name'); 29 30ALTER TABLE `store_mst` ADD UNIQUE(`store_id`);
補足2
伝わりづらいようなので要件の説明を追加します。
チェーン店で設定した商品分類タグはそれに紐づく店舗でも共通して画面表示されるので、チェーン店の共通タグと店舗個別のタグを足した合計が5件を超えるstore_idを取得したい
というものになります。回答者様のコメント欄にも詳しく記載してますので併せてご覧下さい。
回答2件
あなたの回答
tips
プレビュー