在一段时间之前,我从这里获得了来自规范的calculating成分的非常可靠的查询,但随着时间的推移,我需要提前一点。
以下是示例表:
CREATE TABLE myusedfood
(mybill int, mydate text, food_code int, food_name text, qtyu integer, meas text);
INSERT INTO myusedfood (mybill, mydate, food_code, food_name, qtyu, meas)
VALUES (1, '03.01.2014', 10, 'spaghetti', 3, 'pcs'),
(2, '04.01.2014', 156, 'mayonnaise', 2, 'pcs'),
(3, '06.01.2014', 173, 'ketchup', 1, 'pcs'),
(4, '07.01.2014', 172, 'bolognese sauce', 2, 'pcs'),
(5, '08.01.2014', 173, 'ketchup', 1, 'pcs'),
(6, '15.01.2014', 175, 'worchester sauce', 2, 'pcs'),
(7, '16.01.2014', 177, 'parmesan', 1, 'pcs'),
(8, '17.01.2014', 10, 'spaghetti', 2, 'pcs'),
(9, '18.01.2014', 156, 'mayonnaise', 1, 'pcs'),
(10, '19.01.2014', 10, 'spaghetti', 2, 'pcs'),
(11, '19.01.2014', 1256, 'spaghetti rinf', 100, 'gramm'),
(12, '20.01.2014', 156, 'mayonnaise', 2, 'pcs'),
(13, '21.01.2014', 173, 'ketchup', 1, 'pcs'),
(14, '19.01.2014', 10, 'spaghetti', 2, 'pcs');
DROP TABLE IF EXISTS myingredients;
CREATE TABLE myingredients
(food_code int, ingr_code int, ingr_name text, qtyi decimal(10, 3), meas text);
INSERT INTO myingredients (food_code, ingr_code, ingr_name, qtyi, meas)
VALUES (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');
第一个表格包含帐单的编号和日期,注明的代码/成分代码,名称,选择的数量。
其次代表规范性代码,成分代码,成分的名称,成分与相关规范的数量。
通过这个查询,我列出了所有规范中的所有成分以及没有任何成分的规范。那工作还可以。
SELECT SUM(f.qtyu) AS used,
COALESCE(i.ingr_code, f.food_code) AS code,
COALESCE(i.ingr_name, f.food_name) AS f_name,
SUM(COALESCE(i.qtyi, 1) * f.qtyu) AS qty,
COALESCE(i.meas, f.meas) AS meas
FROM myusedfood f LEFT JOIN myingredients i
ON f.food_code = i.food_code
GROUP BY COALESCE(i.ingr_code, f.food_code),
COALESCE(i.ingr_name, f.food_name),
COALESCE(i.meas, f.meas)
ORDER BY code;
随着时间的推移,我真正的桌子变得庞大而且查询速度变慢。我经常需要只获得一个食品代码的结果,但我不知道如何正确地处理速度。
例如,如果我们查询成分代码1256,显示表应该是
used ing.code ing.name qty meas
------------------------------------------------------
109, 1256, "spaghetti rinf", 775.000, "gramm"
第1256条用于"使用"规范(10)和100g :)共9次,全部数量为775克。
这里我有两个问题: 如何优化上层查询只列出一个代码而不是全部,比如代码1256? 如何获取与代码1256相关的所有记录的列表。
结果应如下所示:
bill date code name qty
------------------------------------------------------
1, '03.01.2014', 10, 'spaghetti', 225
8, '17.01.2014', 10, 'spaghetti', 150
10, '19.01.2014', 10, 'spaghetti', 150
11, '19.01.2014', 1256, 'spaghetti rinf', 100
14, '19.01.2014', 10, 'spaghetti', 150
------------------------------------------------------
775
注意,成分1256可以按规范(10)或单独按照原样进行选择。
请帮助解决这两个问题。