0

我必须计算存储在 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 并为每一行查询 table2 然后添加结果等等(使用 C)来做到这一点,这在较大的数据上可能会非常慢。

表 1 包含食品代码、食品名称和使用数量。表 2 包含一份食物的代码和使用数量的成分(按杂乱顺序)以及其中出现的食物代码。
表 1 中使用的数量应根据每个配方与表 2 中的数量相乘,并应添加到配料代码的结果中。
因此,食品“意大利面条”的所有成分行都以食品意大利面条代码 (10) 开头。
不含任何配料的食品应按表 1 中的数量计算,并以相同的名称显示。这实际上意味着它是最终产品(如啤酒瓶)。
这里可能更复杂,但我不敢问。例如,在 ingredinets 列表中可能是自己制作的成分。例如芥末,其中含有醋、盐、种子等……然后呢?在所示示例的表 2 中,芥末用作现成产品(组分)。

这里有什么方法可以进行这样的计算并使用 PostgreSQL 快速获得结果,这将为 C 程序提供现成的结果?
也许对我来说不像看起来那么复杂?该查询的外观如何?

4

1 回答 1

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

输出:

| 使用_TIMES | 代码 | 姓名 | 数量 | 测量 |
-------------------------------------------------- --
| 2 | 173 | 番茄酱| 2 | 个人电脑 |
| 2 | 1130 | 咸牛肉| 80 | 克 |
| 2 | 第1135章 月桂树 | 0.8 | 克 |
| 2 | 第1136章 丁香 | 2 | 克 |
| 2 | 1138 | 番茄| 高分辨率照片| CLIPARTO 160 | 克 |
| 3 | 第1139章 芥末| 15 | 克 |
| 3 | 1140 | 新鲜鸡蛋| 150 | 克 |
| 8 | 第1144章 盐| 3.4 | 克 |
| 5 | 第1256章 意大利面条rinf | 375 | 克 |
| 8 | 第1258章 油| 362 | 克 |

这是SQLFiddle演示

于 2013-06-12T08:42:40.580 回答