如何将应用程序内存中的表映射到查询

时间:2018-03-26 10:43:11

标签: mysql sql mariadb

这个问题让我烦恼,我无法在谷歌或任何东西上找到它。

我使用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不存储表/字段来重建可行的分类列表),我的问题是什么?本质上,类别表存储在应用程序端,并且(由于应用程序上下文)将其存储在数据库中是不可行的吗?

  1. 我可以使用临时表。但在我的问题中,产品和类别数量相当大(+ -10K记录),我需要大约10个临时表用于不同的分组用途。对于我来说,创建10个临时表,执行10K大型Insert子句,并且每次应用程序请求一次又一次地执行它是不明智的。

  2. 我希望在查询中将表定义为静态定义列表,有点像IN(),尽管列表在GROUP子句中重用(因此你不能使用IN())

  3. 像:

    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语法/单词/方法才能做到这一点。

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

2 个答案:

答案 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