0

这发生在从 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
4

0 回答 0