复杂的Mysql查询生成报告

时间:2012-03-13 14:37:49

标签: mysql

我有两个表产品和stock_mvt

CREATE TABLE `products` (  
   `product_id`    int(11) NOT NULL AUTO_INCREMENT,  
   `product_name`  varchar(50) NOT NULL,  
   `category_id`   int(11) DEFAULT NULL,  
   `inventory`     int(11) NOT NULL DEFAULT '0', 
   `product_price` decimal(10,2) NOT NULL DEFAULT '0.00',  
   `obs`           varchar(50) NOT NULL,  
   PRIMARY KEY (`product_id`),  
   KEY `category_id` (`category_id`),  
   CONSTRAINT `products_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`category_id`) )
ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=latin1

CREATE TABLE `stock_mvt` 
(  `mvt_id`     int(11) NOT NULL AUTO_INCREMENT, 
   `trans_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
   `product_id` int(11) NOT NULL,  
   `stock_plus` int(11) NOT NULL, 
   `stock_minus` int(11) NOT NULL,
   PRIMARY KEY (`mvt_id`),  
   KEY `product_id` (`product_id`),  
   CONSTRAINT `stock_mvt_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`) )
ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=latin1

我想生成每日报告收集: Product_id,Product_name,Product_price,库存之前,Stock_plus,stock_minus,库存之后。 我有很多查询要执行,让我们看看最后的查询:

SELECT 
      product_name, 
      inventory - ifnull( sum( stock_mvt.stock_minus ) , 0 ) 
                - ifnull( sum( stock_mvt.stock_plus ), 0 ) AS InventoryBF
   FROM
      products
         LEFT JOIN stock_mvt 
            ON products.product_id = stock_mvt.product_id
   WHERE 
      date( stock_mvt.trans_date ) < "2012-02-23"
   GROUP BY 
      products.product_name

以前有库存和

SELECT 
      product_name, 
      inventory - ifnull( sum( stock_mvt.stock_minus ) , 0 ) 
                - ifnull( sum( stock_mvt.stock_plus ) , 0 ) AS InventoryAf
   FROM
      products
         LEFT JOIN stock_mvt 
            ON products.product_id = stock_mvt.product_id
   WHERE
      date( stock_mvt.trans_date ) <= "2012-02-23"
   GROUP BY 
      products.product_name

有了库存之后,那两个Mysql查询给了我那些当天有库存变动的产品我希望所有产品都有0个动作第二个问题我不能为我的所有查询做联合,所以我的问题是:拜托,有没有更好的方法让我做我的查询,让我的报告包含我想要显示的所有数据?谢谢

1 个答案:

答案 0 :(得分:0)

在格式化原始查询的可读性之后,现在有意义......当你应用WHERE子句时,这会导致隐含的“INNER JOIN”,除非你用NULL或(无论条件)限定它。要将其保持为LEFT JOIN,请将日期条件限定符向上移动到LEFT JOIN部分...

LEFT JOIN STOCK_MVT
   ON  product...
   AND Date( trans_date ) ...

并从WHERE子句中删除Date()限定符