数据库中有两个表。第一个表是pg_akun表,该表用于存储帐户列表,这是主表。第二个表是pg_trans表,用于存储来自用户的输入结果。
pg_akun:
id_akun parent_id_akun nama_akun level_akun
------- -------------- ----------------------- ------------
1 0 ELECTRONIC 1
2 1 COMPUTER 2
3 2 Notebook 3
4 2 Desktop 3
5 4 Desktop Office 4
6 4 Desktop Gaming 4
7 6 Desktop Low Gaming 5
8 6 Desktop Med Gaming 5
9 6 Desktop High Gaming 5
10 9 Desktop Only 6
11 9 Desktop With 32 Monitor 6
12 11 Black 7
13 11 White 7
14 9 Desktop With 60 Monitor 6
15 14 Black 7
16 14 Red 7
17 2 AIO Personal Computer 3
18 0 FURNITURE 1
19 18 TABLE 2
20 19 Coffee Table 3
21 19 Dining Table 3
22 18 SOFA 2
23 22 Sola Sofa 3S 3
24 22 Roosa Sofa 3S 3
这是表pg_akun的sql:
CREATE TABLE `pg_akun` (
`id_akun` int(3) NOT NULL AUTO_INCREMENT,
`parent_id_akun` int(3) DEFAULT NULL,
`nama_akun` varchar(200) DEFAULT NULL,
`level_akun` int(1) DEFAULT NULL,
PRIMARY KEY (`id_akun`),
KEY `pg_akun_index` (`level_akun`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1;
/*Data for the table `pg_akun` */
insert into `pg_akun`(`id_akun`,`parent_id_akun`,`nama_akun`,`level_akun`) values (1,0,'ELECTRONIC',1),(2,1,'COMPUTER',2),(3,2,'Notebook',3),(4,2,'Desktop',3),(5,4,'Desktop Office',4),(6,4,'Desktop Gaming',4),(7,6,'Desktop Low Gaming',5),(8,6,'Desktop Med Gaming',5),(9,6,'Desktop High Gaming',5),(10,9,'Desktop Only',6),(11,9,'Desktop With 32 Monitor',6),(12,11,'Black',7),(13,11,'White',7),(14,9,'Desktop With 60 Monitor',6),(15,14,'Black',7),(16,14,'Red',7),(17,2,'AIO Personal Computer',3),(18,0,'FURNITURE',1),(19,18,'TABLE',2),(20,19,'Coffee Table',3),(21,19,'Dining Table',3),(22,18,'SOFA',2),(23,22,'Sola Sofa 3S',3),(24,22,'Roosa Sofa 3S',3);
pg_trans
id_nominal id_akun volume price id_user
---------- ------- ------ ------- ---------
1 5 2.00 5000.00 1
2 7 4.00 8000.00 1
9 10 3.00 9000.00 1
10 12 3.00 9500.00 1
11 13 2.00 9500.00 1
12 20 2.00 3000.00 1
13 24 2.00 1500.00 1
14 3 1.00 500.00 1
这是表pg_trans的sql:
CREATE TABLE `pg_trans` (
`id_nominal` int(3) NOT NULL AUTO_INCREMENT,
`id_akun` int(3) DEFAULT NULL,
`volume` decimal(12,2) DEFAULT NULL,
`price` decimal(12,2) DEFAULT NULL,
`id_user` int(3) DEFAULT NULL,
PRIMARY KEY (`id_nominal`),
KEY `pg_trans_fk_id_akun` (`id_akun`),
KEY `pg_trans_fk_id_user` (`id_user`),
CONSTRAINT `pg_trans_fk_id_akun` FOREIGN KEY (`id_akun`) REFERENCES `pg_akun` (`id_akun`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;
/*Data for the table `pg_trans` */
insert into `pg_trans`(`id_nominal`,`id_akun`,`volume`,`price`,`id_user`) values (1,5,'2.00','5000.00',1),(2,7,'4.00','8000.00',1),(9,10,'3.00','9000.00',1),(10,12,'3.00','9500.00',1),(11,13,'2.00','9500.00',1),(12,20,'2.00','3000.00',1),(13,24,'2.00','1500.00',1),(14,3,'1.00','500.00',1);
填写pg_trans表的规则:(实际上,该表中的输入是从应用程序获得的):
示例: 表pg_akun,id_akun数字2。无法将id_key输入到pg_trans表中。因为数字2在parent_id_key中 但是对于ID号3,可以将id_key输入到pg_trans表中。因为数字3不在parent_id_akun
然后从两个表中可以得出结果:
为了简化,这是预期的结果
level_akun id_akun parent_id_akun nama_akun volume price total
---------- ------- -------------- ----------------------- ------ ------- -------------
1 1 0 ELECTRONIC (NULL) (NULL) 117000.0000
2 2 1 COMPUTER (NULL) (NULL) 117000.0000
3 3 2 Notebook 1.00 500.00 500.0000
3 4 2 Desktop (NULL) (NULL) 116500.0000
4 5 4 Desktop Office 2.00 5000.00 10000.0000
4 6 4 Desktop Gaming (NULL) (NULL) 106500.0000
5 7 6 Desktop Low Gaming 4.00 8000.00 32000.0000
5 8 6 Desktop Med Gaming (NULL) (NULL) (NULL)
5 9 6 Desktop High Gaming (NULL) (NULL) 74500.0000
6 10 9 Desktop Only 3.00 9000.00 27000.0000
6 11 9 Desktop With 32 Monitor (NULL) (NULL) 47500.0000
7 12 11 Black 3.00 9500.00 28500.0000
7 13 11 White 2.00 9500.00 19000.0000
6 14 9 Desktop With 60 Monitor (NULL) (NULL) (NULL)
7 15 14 Black (NULL) (NULL) (NULL)
7 16 14 Red (NULL) (NULL) (NULL)
3 17 2 AIO Personal Computer (NULL) (NULL) (NULL)
1 18 0 FURNITURE (NULL) (NULL) 9000.0000
2 19 18 TABLE (NULL) (NULL) 6000.0000
3 20 19 Coffee Table 2.00 3000.00 6000.0000
3 21 19 Dining Table (NULL) (NULL) (NULL)
2 22 18 SOFA (NULL) (NULL) 3000.0000
3 23 22 Sola Sofa 3S (NULL) (NULL) (NULL)
3 24 22 Roosa Sofa 3S 2.00 1500.00 3000.0000
说明: 例如:id_akun 24。
问题是如何使用性能良好的mysql查询来做到这一点。 因为到目前为止,我使用的查询多达1116行,并将它们放入存储过程中。
对不起,我无法在此处输入查询,因为它超出了此处的最大帖子数限制