MySQL查询-我需要一些帮助来完善它
我有一个包含两个表的数据库。第一个(“日历”)只包含一系列日期,如“2012-12-25”到未来。这是由一个过程生成的。第二个(“新分配”)包含一系列股票分配。示例内容如下所示:MySQL查询-我需要一些帮助来完善它,mysql,Mysql,我有一个包含两个表的数据库。第一个(“日历”)只包含一系列日期,如“2012-12-25”到未来。这是由一个过程生成的。第二个(“新分配”)包含一系列股票分配。示例内容如下所示: +----+-------------+------------+----------+------------+ | id | delivery_ID | date | quantity | product_ID | +----+-------------+------------+----------+
+----+-------------+------------+----------+------------+
| id | delivery_ID | date | quantity | product_ID |
+----+-------------+------------+----------+------------+
| 1 | 1 | 2012-11-09 | 5 | 2 |
| 2 | 1 | 2012-11-08 | 5 | 2 |
| 3 | 2 | 2012-11-07 | 5 | 2 |
| 4 | 3 | 2012-11-06 | 5 | 2 |
| 5 | 4 | 2012-11-03 | 2 | 2 |
| 6 | 4 | 2012-11-02 | 5 | 2 |
| 7 | 5 | 2012-11-03 | 3 | 2 |
| 8 | 6 | 2012-11-05 | 5 | 2 |
| 9 | 7 | 2012-11-07 | 55 | 5 |
| 10 | 7 | 2012-11-06 | 34 | 5 |
| 11 | 7 | 2012-11-05 | 40 | 5 |
+----+-------------+------------+----------+------------+
+------------+------+
| Date | Qty |
+------------+------+
| 2012-10-29 | 0 |
| 2012-10-30 | 0 |
| 2012-10-31 | 0 |
| 2012-11-01 | 0 |
| 2012-11-02 | 5 |
| 2012-11-03 | 5 |
| 2012-11-05 | 5 |
| 2012-11-06 | 5 |
| 2012-11-07 | 5 |
| 2012-11-08 | 5 |
| 2012-11-09 | 5 |
| 2012-11-10 | 0 |
+------------+------+
下面的查询(基本上是指“显示所提供日期范围内的日期列表,不包括星期日,以及当天的总库存分配”)几乎就是我想要的,只是它适用于所有产品(用“产品ID”表示)
事实上,我想要的是这样的:
+----+-------------+------------+----------+------------+
| id | delivery_ID | date | quantity | product_ID |
+----+-------------+------------+----------+------------+
| 1 | 1 | 2012-11-09 | 5 | 2 |
| 2 | 1 | 2012-11-08 | 5 | 2 |
| 3 | 2 | 2012-11-07 | 5 | 2 |
| 4 | 3 | 2012-11-06 | 5 | 2 |
| 5 | 4 | 2012-11-03 | 2 | 2 |
| 6 | 4 | 2012-11-02 | 5 | 2 |
| 7 | 5 | 2012-11-03 | 3 | 2 |
| 8 | 6 | 2012-11-05 | 5 | 2 |
| 9 | 7 | 2012-11-07 | 55 | 5 |
| 10 | 7 | 2012-11-06 | 34 | 5 |
| 11 | 7 | 2012-11-05 | 40 | 5 |
+----+-------------+------------+----------+------------+
+------------+------+
| Date | Qty |
+------------+------+
| 2012-10-29 | 0 |
| 2012-10-30 | 0 |
| 2012-10-31 | 0 |
| 2012-11-01 | 0 |
| 2012-11-02 | 5 |
| 2012-11-03 | 5 |
| 2012-11-05 | 5 |
| 2012-11-06 | 5 |
| 2012-11-07 | 5 |
| 2012-11-08 | 5 |
| 2012-11-09 | 5 |
| 2012-11-10 | 0 |
+------------+------+
我已经前后翻阅了这篇文章,但无法正确地表达这个问题——我遗漏了什么
非常感谢
CREATE TABLE `new_allocations` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`delivery_ID` int(11) DEFAULT NULL,
`date` date DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`product_ID` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
INSERT INTO `new_allocations` (`id`, `delivery_ID`, `date`, `quantity`, `product_ID`)
VALUES
(1,1,'2012-11-09',5,2),
(2,1,'2012-11-08',5,2),
(3,2,'2012-11-07',5,2),
(4,3,'2012-11-06',5,2),
(5,4,'2012-11-03',2,2),
(6,4,'2012-11-02',5,2),
(7,5,'2012-11-03',3,2),
(8,6,'2012-11-05',5,2),
(9,7,'2012-11-07',55,5),
(10,7,'2012-11-06',34,5),
(11,7,'2012-11-05',40,5);
日历:
DROP TABLE IF EXISTS `calendar`;
CREATE TABLE `calendar` (
`datefield` date DEFAULT NULL
)
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `fill_calendar`(start_date DATE, end_date DATE)
BEGIN
DECLARE crt_date DATE;
SET crt_date=start_date;
WHILE crt_date < end_date DO
INSERT INTO calendar VALUES(crt_date);
SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
END WHILE;
END;;
DELIMITER ;
填写日历的过程如下:
DROP TABLE IF EXISTS `calendar`;
CREATE TABLE `calendar` (
`datefield` date DEFAULT NULL
)
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `fill_calendar`(start_date DATE, end_date DATE)
BEGIN
DECLARE crt_date DATE;
SET crt_date=start_date;
WHILE crt_date < end_date DO
INSERT INTO calendar VALUES(crt_date);
SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
END WHILE;
END;;
DELIMITER ;
分隔符;;
CREATE DEFINER=`root`@`localhost`过程`fill\u calendar`(开始日期、结束日期)
开始
宣布crt_日期;
设置crt\u日期=开始日期;
而crt\u date
将您的条件添加到ON
子句中,而不是WHERE
子句中:
SELECT datefield AS Date, COALESCE(SUM(quantity), 0) AS Qty
FROM calendar
LEFT JOIN
new_allocations
ON new_allocations.date = calendar.datefield
AND product_ID = '2'
WHERE calendar.datefield BETWEEN '2012-10-29' AND '2012-11-10'
AND dayname(calendar.datefield) != 'Sunday'
GROUP BY
datefield
其中
过滤联接的结果。如果给定日期没有分配,则左连接将生成一条日期记录,其中所有新的\u分配
字段(包括productId
)设置为NULL
,非常感谢。这正是我想要的,而我自己也永远不会到达那里。(当它让我——这仍然是一个非常新的问题)有一个美好的一天时,我会把它标记为答案。