このディレクトリの索引

# 出典 :: SQL質疑応答スレ 12問目 #244 # MySQL5です。 # # shop # id name # 1 Aカンパニー # 2 Bカンパニー # 3 Cカンパニー # # area # 1 北海道 # 2 青森 # 3 岩手 # 4 秋田 # # shop_area # shop_id area_id # 1 1 # 1 2 # 1 3 # 2 2 # 2 4 # 3 2 # 3 3 # # 青森と岩手、両方に支店のある会社を抽出したいです。 # shop_id name # 1 Aカンパニー # 3 Cカンパニー # # 「青森、岩手のどちらかに店舗のある」という条件でしたら # SELECT shop.id AS shop_id, shop.name FROM shop_area INNER JOIN shop ON shop_area.shop_id = shop.id WHERE shop_area.area_id IN (2, 3) ORDER BY shop.id # というので出来たのですが、「両方にある」という条件になったら書き方がわかりません。 # # よろしくお願いします。 # shop(1,'Aカンパニー'). shop(2,'Bカンパニー'). shop(3,'Cカンパニー'). area(1,北海道). area(2,青森). area(3,岩手). area(4,秋田). shop_area(1,1). shop_area(1,2). shop_area(1,3). shop_area(2,2). shop_area(2,4). shop_area(3,2). shop_area(3,3). '青森、岩手の両方に店舗のあるカンパニー'(_id,_name) :- カンパニーの候補を得る(_id,_name), 店舗を二つ取り出す(_id,_area_id_1,_area_id_2), 青森と岩手の両方に店舗がある(_area_id_1,_area_id_2). カンパニーの候補を得る(_id,_name) :- shop(_id,_name). 店舗を二つ取り出す(_id,_area_id_1,_area_id_2) :- shop_area(_id,_area_id_1), shop_area(_id,_area_id_2), \+(_area_id_1 = _area_id_2). 青森と岩手の両方に店舗がある(_area_id_1,_area_id_2) :- 青森に(_area_id_1), 岩手に(_area_id_2),!. 青森に(_area_id) :- area(_area_id,青森). 岩手に(_area_id) :- area(_area_id,岩手). % % 問題文の中に支店と店舗という二つの語が同じ意味で使われている。 % ここでは店舗の方を採用した。 %