这个问题让我烦恼,我无法在谷歌或任何东西上找到它。
我使用MySQL / MariaSQL来解决这个问题。
我的问题不是相关的产品/类别,但我会用这个类比。
假设您有一个记录(产品)列表,其中包含大量关于每个记录的信息(列)(包括例如每个产品当前仓库中的单位数量)。假设您还对记录进行了分类。
使用SUM和GROUP的简单INNER JOIN将为您提供每个类别的仓库中的单位:
CREATE TABLE product ( product_id BIGINT , units_in_warehouse BIGINT );
CREATE TABLE category ( category_id BIGINT , product_id BIGINT );
INSERT INTO product VALUES (1,5),(2,1),(3,8),(4,9),(5,10),(6,2),(7,9),(8,12),(9,3);
INSERT INTO category VALUES (1,8),(1,7),(1,7),(2,6),(2,2),(2,6),(2,5),(2,4),(2,5),(3,9),(3,3),(3,1),(4,4),(4,2),(4,8),(5,2),(5,1),(5,3),(5,9),(5,8),(5,1);
SELECT category_id, SUM( units_in_warehouse ) AS category_units_in_warehouse
FROM product
INNER JOIN category
ON product.product_id = category.product_id
GROUP BY category_id;
DROP TABLE product;
DROP TABLE category;
如果您的类别表每个应用程序处理时间完全不同,基于仅应用程序知道的标准(例如,DB不存储表/字段来重建可行的分类列表),我的问题是什么?本质上,类别表存储在应用程序端,并且(由于应用程序上下文)将其存储在数据库中是不可行的吗?
我可以使用临时表。但在我的问题中,产品和类别数量相当大(+ -10K记录),我需要大约10个临时表用于不同的分组用途。对于我来说,创建10个临时表,执行10K大型Insert子句,并且每次应用程序请求一次又一次地执行它是不明智的。
我希望在查询中将表定义为静态定义列表,有点像IN(),尽管列表在GROUP子句中重用(因此你不能使用IN())
像:
SELECT category_id, SUM( units_in_warehouse ) AS category_units_in_warehouse
FROM product
INNER JOIN (
/* Badly written SQL here */
SELECT category_id , product_id
VALUES (1,8),(1,7),(1,7),(2,6),(2,2),(2,6),(2,5),(2,4),(2,5),(3,9),(3,3),(3,1),(4,4),(4,2),(4,8),(5,2),(5,1),(5,3),(5,9),(5,8),(5,1)
/* /Badly written SQL here */
) category
ON product.product_id = category.product_id
GROUP BY category_id;
...但是我没有遇到任何SQL语法/单词/方法才能做到这一点。
有人有什么建议吗?您如何有效地将应用程序内存中的表映射到数据库以进行查询?
答案 0 :(得分:0)
尽管如此,我不确定它是否是最有效的方法,但您可以尝试以下方法:
SELECT category_id, SUM( units_in_warehouse ) AS category_units_in_warehouse
FROM product
INNER JOIN (
SELECT 1 as category_id , 8 as product_id
UNION ALL
SELECT 1,7
UNION ALL
SELECT 1,7
UNION ALL
SELECT 2,6
) category
ON product.product_id = category.product_id
GROUP BY category_id;
答案 1 :(得分:0)
如果产品:类别很多:很多,则需要有第三个表来显示许多:许多映射。为清楚起见,应将其称为product_category
(不仅仅是category
)。
然后,您可能需要JOIN
所有3个表格来显示有关产品及其类别的信息。
此处给出了映射表的效率注意事项:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table