我有两个表产品和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个动作第二个问题我不能为我的所有查询做联合,所以我的问题是:拜托,有没有更好的方法让我做我的查询,让我的报告包含我想要显示的所有数据?谢谢
答案 0 :(得分:0)
在格式化原始查询的可读性之后,现在有意义......当你应用WHERE子句时,这会导致隐含的“INNER JOIN”,除非你用NULL或(无论条件)限定它。要将其保持为LEFT JOIN,请将日期条件限定符向上移动到LEFT JOIN部分...
LEFT JOIN STOCK_MVT
ON product...
AND Date( trans_date ) ...
并从WHERE子句中删除Date()限定符