【发布时间】:2015-08-01 17:54:58
【问题描述】:
大家好,我有 3 张桌子。 这是创建数据:
CREATE TABLE `positionstyp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`bau_nr_komplett` varchar(32) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `positionstyp_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `positionstyp` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE `projektposition` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`projekt_id` int(11) NOT NULL,
`preis_vertragskosten` float DEFAULT NULL,
`positionstyp_id` int(11),
PRIMARY KEY (`id`),
KEY `positionstyp_id` (`positionstyp_id`),
CONSTRAINT `fk_projektposition_positionstypID` FOREIGN KEY (`positionstyp_id`) REFERENCES `positionstyp` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE `menge` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`baufortschritt` int(11) NOT NULL DEFAULT 0,
`menge` float NOT NULL,
`projektposition_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `projektposition_id` (`projektposition_id`),
CONSTRAINT `menge_ibfk_10` FOREIGN KEY (`projektposition_id`) REFERENCES `projektposition` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
INSERT INTO `positionstyp` (`id`, `parent_id`, `bau_nr_komplett`) VALUES
(1, NULL, '1'),
(2, NULL, '2'),
(3, NULL, '3'),
(4, NULL, '4'),
(5, NULL, '5'),
(6, NULL, '6'),
(7, 3, '325'),
(8, 7, '325.0'),
(9, 7, '325.1'),
(10, 8, '325.0.0');
INSERT INTO `projektposition` (`id`, `projekt_id`, `preis_vertragskosten`, `positionstyp_id`) VALUES
(1, 1325, 100, 3),
(2, 1325, 300, 7),
(3, 1325, 150, 7),
(4, 1325, 200, 10),
(5, 1325, 50, 9);
INSERT INTO `menge` (`id`, `menge`, `baufortschritt`, `projektposition_id`) VALUES
(1, 10, 1, 1),
(2, 20, 20, 2),
(3, 30, 30, 3),
(4, 40, 40, 4),
(5, 50, 100, 5),
(6, 60, 87, 1),
(7, 70, 90, 2),
(8, 80, 10, 3),
(9, 90, 50, 4),
(10, 100, 0, 5),
(11, 1000, 100, 5),
(12, 100, 10, 6);
一个“menge”绑定到一个“projektposition”,一个“projektposition”绑定到一个“positionstyp”。那么一个“positionstyp”可能有一个父“positionstyp”。
在“menge”中有一个字段“menge”和一个加重“menge”的字段“baufortschritt”。然后字段“preis_vertragskosten”给这个组合一个价格。
所以一个menge的价格是(menge.menge * menge.baufortschritt * projektposition.preis_vertragskosten)
在我的 SELECT 中,我想要所有带有汇总价格的“positionstyp”条目,以及下面没有“menge”/“projektposition”的“positionstyp”条目,因此没有价格,仅适用于特定的“projekt_id”
我的第一次尝试是使用 group by 和 rollup,但在所有没有价格的“positionstyp”中都失败了。
现在我的代码接近我想要的:
SELECT
pt.id,
pt.parent_id,
SUM(IF(m.menge IS NULL,0, m.menge * p.preis_vertragskosten * m.baufortschritt/100 * (p.projekt_id=1325))) as summe,
pt.bau_nr_komplett
FROM positionstyp pt
LEFT JOIN projektposition p ON (p.positionstyp_id=pt.id)
LEFT JOIN menge m ON (m.projektposition_id=p.id)
GROUP BY pt.id
输出正确地总结了 menge,但当然没有总结递归位置typ_parents。位置类型表的递归性可以更容易地在bau_nr_komplett 字段中找到:位置类型是所有位置类型的子项,即 bau_nr_komplett 是子位置类型的开头sbau_nr_komplett`(不必是直接的孩子)。
有人有想法吗?
感谢和最好的问候, 托比亚斯
现在的结果是:
bau_nr_komplett summe
1 0
2 0
3 5230
4 0
5 0
6 0
325 22650
325.0 0
325.1 52500
325.0.0 12200
想要的结果是:
bau_nr_komplett summe
1 0
2 0
3 5230+22650+52500+12200
4 0
5 0
6 0
325 22650+52500+12200
325.0 12200
325.1 52500
325.0.0 12200
-- 编辑 2: 我找到了一个不好的解决方案。不好意味着它适用于测试数据集。但是对于真正的数据库和 100.000 个数据集,它需要半个小时;D
SELECT pt.bau_nr_komplett, (
SELECT
SUM(IF(m1.menge IS NULL,0,m1.menge*p1.preis_vertragskosten*m1.baufortschritt/100*(p1.projekt_id=1325)))
FROM positionstyp pt1
LEFT JOIN projektposition p1 ON ( p1.positionstyp_id = pt1.id )
LEFT JOIN menge m1 ON ( m1.projektposition_id = p1.id )
WHERE pt1.bau_nr_komplett LIKE CONCAT( pt.bau_nr_komplett, "%" )
) as summe
FROM positionstyp pt
LEFT JOIN projektposition p ON ( p.positionstyp_id = pt.id )
LEFT JOIN menge m ON ( m.projektposition_id = p.id )
GROUP BY pt.id
【问题讨论】:
-
想要的结果是什么?
-
那么positionstyp_id "DEFAULT NULL" !?!?!?!?
-
想要的结果,在 html 中,对不起。 DEFAULT NULL 是一个复制粘贴错误
-
复制粘贴错误?有趣!
标签: mysql aggregation