このディレクトリの索引

# 出典 :: SQL質疑応答スレ 10問目 #276 # MySQL5を使用しています。 # # # 以下のようなテーブルがあります。 # # itemテーブル # item_id name color # 1 商品1 3 # 2 商品2 12 # 3 商品3 7 # # colorテーブル # color_id name # 1 赤 # 2 青 # 4 緑 # 8 黒 # # item.colorの部分は、ビット演算の概念を使って # 3なら赤+青 # 12なら緑+黒 # 7なら赤+青+緑 # の色を持っていることを意味します。 # # これを結合の段階で、以下のように色名を取得することは可能なのでしょうか? # # 1 商品1 赤 # 1 商品1 青 # 2 商品2 緑 # 2 商品2 黒 # 3 商品3 赤 # 3 商品3 青 # 3 商品3 緑 # item(1,商品1,3). item(2,商品2,12). item(3,商品3,7). color(1,赤). color(2,青). color(4,緑). color(8,黒). 色名を取得する :- forall(item(_item_id,_name,_color),(色の割り当て(_color,_色名),writef('%w %w %w\n',[_item_id,_name,_色名])). 色の割り当て(_色番号,_色名) :- findall([_color_id,_name],color(_color_id,_name),L), sort(L,L1), reverse(L1,L2), 色の割り当て(_色番号,L2,_色名). 色の割り当て(N,_,_) :- N =< 0,!,fail. 色の割り当て(N,[[C,_色名]|R1],_色名) :- 1 is N // C. 色の割り当て(N,[[C,_]|R1],_色名) :- 1 is N // C, M is N mod C, 色の割り当て(M,R1,_色名). 色の割り当て(N,[[C,_]|R1],_色名) :- 0 is N // C, M is N mod C, 色の割り当て(M,R1,_色名).