2012-03-13 90 views
1

我有兩個表的產品和stock_mvt複雜Mysql的查詢來生成報告

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 

我想要生成每日報告收集:,Stock_plus,stock_minus,庫存前後 PRODUCT_ID,PRODUCT_NAME,PRODUCT_PRICE,庫存。 我有很多查詢的執行,讓剛剛看到最後的:

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動作第二個問題,我不能做聯合所有我的疑問,所以我的問題是:請問,有沒有更好的辦法讓我做我的查詢我的報告與我想要顯示的所有數據?謝謝

+0

在第二個SQL語句刪除日期()預選賽我認爲'<='應該是'> ='。 – user1027167 2012-03-13 15:30:01

+0

謝謝,但sql語句是好的,正如我所說的我的問題是如何把它們全部一起並獲得所有產品清單 – 2012-03-13 19:58:41

回答

0

爲了提高原始查詢的可讀性,格式化之後就變得有意義了......當您應用WHERE子句時,除非您使用NULL或(任何條件)限定它,否則會導致暗含的「INNER JOIN」。爲了保持它作爲一個LEFT JOIN,將日期條件限定到LEFT JOIN部分...

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

和WHERE子句

+0

這對我有用Thx,這對我來說是有道理的,現在我會嘗試放在一起,我會反饋 – 2012-03-13 20:06:21