这发生在从 Mysql 5.5 升级到 Mysql 8 之后。
假设我们有 2 个数据集,它们都代表系统上不同类型的销售订单。
CREATE TABLE `tmp_order_header` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_number` varchar(100) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `tmp_order_header` VALUES (1, '123456', '2021-09-30 14:31:29');
CREATE TABLE `tmp_order_item` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_header_id` int unsigned NOT NULL,
`sku` varchar(100) NOT NULL DEFAULT '',
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `order_header_id` (`order_header_id`),
CONSTRAINT `tmp_order_item_ibfk_1` FOREIGN KEY (`order_header_id`) REFERENCES `tmp_order_header` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB;
INSERT INTO `tmp_order_item` VALUES (1, 1, 'ABC123', 10.24, '2021-09-30 14:32:02');
INSERT INTO `tmp_order_item` VALUES (2, 1, 'ABC123', 10.24, '2021-09-30 14:32:02');
INSERT INTO `tmp_order_item` VALUES (3, 1, 'ABC124', 11.44, '2021-09-30 14:32:02');
CREATE TABLE `tmp_order_header1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_number` varchar(100) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `tmp_order_header1` VALUES (1, '1234567', '2021-09-30 14:31:29');
CREATE TABLE `tmp_order_item1` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_header_id` int unsigned NOT NULL,
`sku` varchar(100) NOT NULL DEFAULT '',
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `order_header_id` (`order_header_id`),
CONSTRAINT `tmp_order_item1_ibfk_1` FOREIGN KEY (`order_header_id`) REFERENCES `tmp_order_header1` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB;
INSERT INTO `tmp_order_item1` VALUES (1, 1, 'ABC124', 11.44, '2021-09-30 14:32:02');
INSERT INTO `tmp_order_item1` VALUES (2, 1, 'ABC125', 33.00, '2021-09-30 14:32:02');
INSERT INTO `tmp_order_item1` VALUES (3, 1, 'ABC126', 41.20, '2021-09-30 14:32:02');
我正在尝试运行一个查询,它将为我提供 2 个数据集中的所有订单及其总值:
SELECT
H.id,
H.order_number,
COUNT(DISTINCT I.id) * I.price AS totalPrice
FROM tmp_order_item AS I
INNER JOIN tmp_order_header AS H
GROUP BY H.id
UNION ALL
SELECT
H.id,
H.order_number,
COUNT(DISTINCT I.id) * I.price AS totalPrice
FROM tmp_order_item1 AS I
INNER JOIN tmp_order_header1 AS H
GROUP BY H.id
但在这种情况下,返回的价格计算不正确:
id | order_number | totalPrice
1 | 123456 | 0.00
1 | 1234567 | 0.00
这曾经在 Mysql 5.5 中工作,我在查询中找不到任何明显错误的地方。如果我将查询包装在“SELECT * FROM (##query here##)T1”中,则返回的结果与预期的一样:
id | order_number | totalPrice
1 | 123456 | 30.72
1 | 1234567 | 34.32