这个问题困扰着我,我在Google或其他任何地方都找不到。

我正在使用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;


我的问题是,如果您的类别表在每个应用程序处理时间完全不同(基于仅您的应用程序知道的标准)(例如,数据库不存储表/字段来构造可行的分类列表),该怎么办?本质上,类别表存储在应用程序端,并且由于应用程序上下文的原因而无法将其存储在数据库中吗?


我可以使用临时表。但是在我的问题中,产品和类别数量很大(+ -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语法/单词/方法就能做到这一点。

有任何建议吗?您如何有效地将应用程序内存中的表映射到数据库以进行查询?

最佳答案

虽然,我不确定这是否是最有效的方法,但是您可以尝试以下方法:

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;

关于mysql - 如何将应用程序内存中的表映射到查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49489541/

10-13 07:32
查看更多