mysql - 库存可用 性能 Mysql

标签 mysql sql

我试图获取 MYSQL 中可用库存的值,但是当行数超过 35000 时,请求失败且没有响应。我使用子查询来获取可用股票的值(value)。

这是我的代码:

    SELECT
        p.`product-id` AS id,
        p.`product-id` AS product_id,
        ped.purchase_entry_id AS purchase_id,
        p.`product-name` AS name,
        m.name AS manufacturer,
        p.`product-type` AS product_type,
        ped.id AS batch_no,
        ped.internal_sales_rate AS barcode,
        c.name as category,
        ped.size AS size,
        IFNULL(ped.sales_rate,0) AS sales_rate,
        IFNULL(ped.purchase_rate,0) AS purchase_rate,
        IFNULL(SUM(ped.units),0) AS units_purchased,
        (select IFNULL(SUM(sed.qty),0) FROM sales_entry_details sed WHERE (sed.batch_no = ped.id)) AS units_sold,
        (select IFNULL(SUM(sr.qty),0) FROM sales_return_item sr WHERE (sr.batch_no = ped.id)) AS retured,
        (select IFNULL(SUM(pri.qty),0) FROM purchase_return_items pri WHERE (pri.batch_no = ped.id)) AS purchase_return,
        (select IFNULL(SUM(ast.qty),0) FROM adjustment_stock ast WHERE (ast.batch_no = ped.id)) AS adjustment,
        (select IFNULL(SUM(ast2.batch_no),0) FROM adjustment_stock ast2 WHERE (ast2.batch_no = ped.id)) AS isChecked
    FROM purchase_entry_details ped 
        LEFT JOIN products p on p.`product-id` = ped.product_id
        LEFT JOIN category c ON c.id = p.`product-type`
        LEFT JOIN manufacturer m ON m.id = p.manufacturer
    GROUP BY ped.id;

是否有更好的选择来获取 SQL 中可用股票的值(value)?

最佳答案

查询看起来不错。由于没有限制条件(没有 WHERE 子句),您将按顺序读取整个表。

当然,您希望在相关表中对 batch_no 建立索引。但我猜这些是某些批处理表的外键,因此索引应该已经存在。

我注意到的唯一一件事是您从 adjustment_stock 中选择了两次。您可以通过将子查询移至 FROM 子句来避免这种情况:

SELECT
  p.`product-id` AS id,
  p.`product-id` AS product_id,
  ped.purchase_entry_id AS purchase_id,
  p.`product-name` AS name,
  m.name AS manufacturer,
  p.`product-type` AS product_type,
  ped.id AS batch_no,
  ped.internal_sales_rate AS barcode,
  c.name as category,
  ped.size AS size,
  IFNULL(ped.sales_rate,0) AS sales_rate,
  IFNULL(ped.purchase_rate,0) AS purchase_rate,
  IFNULL(SUM(ped.units),0) AS units_purchased,
  IFNULL(sed.sum_qty),0) AS units_sold,
  IFNULL(sr.sum_qty),0) AS retured,
  IFNULL(pri.sum_qty),0) AS retured,
  IFNULL(ast.sum_qty),0) AS adjustment,
  IFNULL(ast.sum_batch_no),0) AS isChecked
FROM purchase_entry_details ped 
LEFT JOIN products p on p.`product-id` = ped.product_id
LEFT JOIN category c ON c.id = p.`product-type`
LEFT JOIN manufacturer m ON m.id = p.manufacturer
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty from sales_entry_details group by batch_no
) sed on sed.batch_no = ped.id
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty from sales_return_item group by batch_no
) sr on sr.batch_no = ped.id
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty from purchase_return_items group by batch_no
) pri on pri.batch_no = ped.id
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty, sum(batch_no) as sum_batch_no
  from adjustment_stock group by batch_no
) ast on ast.batch_no = ped.id
GROUP BY ped.id;

(不过,将批处理号相加似乎有点奇怪。)

关于mysql - 库存可用 性能 Mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50036276/

相关文章:

sql - Postgresql 将时间戳舍入到最接近的 30 秒

mysql - 是否可以使用sequelize部分更新行?

MySQL 查询,无法弄清楚如何获取正确的数据

mysql - 使用 TinyMCE 发布的图像有大小限制吗?

sql - PostgreSQL 在选择查询中使用 CASE WHEN

sql - 展平表中可能为 NULL 或 presto 为空的数组

mysql - 如何诊断 MySQL 触发器中的步骤

Java - MySQL 到 Hive 的导入,其中 MySQL 在 Windows 上运行,Hive 在 Centos 上运行(Horton 沙盒)

c++ - 'PQconnectdbParams' 未在此范围内声明

java.sql.Statement 或 java.sql.PreparedStatement - 带参数的可滚动结果集