2013-06-12 50 views
0

計算成分複雜查詢我要計算食物和存儲在PostgreSQL的表使用的食品配料:PostgreSQL的,由配方

table1 'usedfood' 

food food     used used 
code name     qty  meas 
---------------------------------------------- 
10  spaghetti    3  pcs 
156  mayonnaise    2  pcs 
173  ketchup     1  pcs 
172  bolognese sauce   2  pcs 
173  ketchup     1  pcs 
10  spaghetti    2  pcs 
156  mayonnaise    1  pcs 

table2 'ingredients' 

food ingr. ingredient  qty  meas  
code code name   /1  in 1 
---------------------------------------------- 
10  1256 spaghetti rinf 75  gramm 
156  1144 salt   0.3  gramm 
10  1144 salt   0.5  gramm 
156  1140 fresh egg  50  gramm 
172  1138 tomato   80  gramm 
156  1139 mustard   5  gramm 
172  1136 clove   1  gramm 
156  1258 oil    120  gramm 
172  1135 laurel   0.4  gramm 
10  1258 oil    0.4  gramm 
172  1130 corned beef  40  gramm 

結果:

used 
times code food/ingredient qty  meas 
---------------------------------------------- 
5  1256 spaghetti rinf 375  gramm 
8  1258 oil    362  gramm 
2  1138 tomato   160  gramm 
3  1140 fresh egg  150  gramm 
2  1130 corned beef  80  gramm 
3  1139 mustard   15  gramm 
8  1144 salt   3.4  gramm 
2  1136 clove   2  gramm 
2  1135 laurel   0.8  gramm 
2  173  ketchup   2  pcs //haven't any ingredients 

現在我通過循環做到這一點通過table1和查詢表2爲每行添加結果等等(使用C)對於較大的數據可能會非常緩慢。

表1包含食品代碼,食品名稱和使用量。 表2中包含的成分(雜亂的順序)與代碼和使用數量爲一個食物的安寧和食品代碼出現。
應根據每個配方將來自table1的使用量與來自table2的數量相乘,並添加到配料代碼的結果中。
因此,所有食材「意大利麪條」的配料行都以食品意大利麪條代碼(10)開頭。
不含任何成分的食物應根據table1中的數量進行計算並顯示相同的名稱。這實際上意味着它是最終產品(如啤酒瓶)。
這裏可能會更復雜,但我很害怕問。 例如在ingredinets列表中可能是他自己配方的成分。例如,含有醋,鹽,種子等的芥末醬......然後呢? 表示實例芥末的表2作爲成品(成分)使用。

在這裏有什麼辦法做這樣的計算和使用PostgreSQL快速獲得結果,這將給C程序提供現成的結果嗎?
也許不像我看起來那麼複雜?該查詢將如何?

回答

1

嘗試

SELECT SUM(f.qty) used_times, 
     COALESCE(i.ingr_code, f.food_code) code, 
     COALESCE(i.name, f.name) name, 
     SUM(COALESCE(i.qty, 1) * f.qty) qty, 
     COALESCE(i.meas, f.meas) meas 
    FROM usedfood f LEFT JOIN ingredients i 
    ON f.food_code = i.food_code 
GROUP BY i.ingr_code, i.name 

輸出:

 
| USED_TIMES | CODE |   NAME | QTY | MEAS | 
---------------------------------------------------- 
|   2 | 173 |  ketchup | 2 | pcs | 
|   2 | 1130 | corned beef | 80 | gramm | 
|   2 | 1135 |   laurel | 0.8 | gramm | 
|   2 | 1136 |   clove | 2 | gramm | 
|   2 | 1138 |   tomato | 160 | gramm | 
|   3 | 1139 |  mustard | 15 | gramm | 
|   3 | 1140 |  fresh egg | 150 | gramm | 
|   8 | 1144 |   salt | 3.4 | gramm | 
|   5 | 1256 | spaghetti rinf | 375 | gramm | 
|   8 | 1258 |   oil | 362 | gramm | 

這裏是SQLFiddle演示

+0

HI彼得,很難相信的,但是這似乎的是需要什麼。我將嘗試將您的查詢應用於具體的模式/數據。非常感謝你! –

+0

@ user973238你不止歡迎:)祝你好運! – peterm

+0

對不起,我的PostgreSQL看起來有點不同(9.1在Windows 7上),所以特定的代碼我得到一組錯誤:錯誤:在「名稱」或其附近的語法錯誤 LINE 1:... code,f.food_code )代碼,COALESCE(i.name,f.name)名稱,SUM(... 錯誤:列「f.food_code」必須出現在GROUP BY子句中或用於集合函數中 LINE 1:.. .LECT SUM(f.qty)used_times,COALESCE(i.ingr_code,f.food_cod ... 錯誤:列「f.name」必須出現在GROUP BY子句中或用於集合函數中 LINE 1: ...(i.ingr_code,f.food_code)code,COALESCE(i.name,f.name)in ... –