优化查询以查找每个级别的总价值

时间:2019-07-09 14:55:31

标签: mysql

数据库中有两个表。第一个表是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表的规则:(实际上,该表中的输入是从应用程序获得的):

  1. 可以通过查看的id_akun来填充pg_trans表 pg_akun表
  2. 没有parent_id_akun的id_akun,则可以在pg_trans表中输入id_akun。

示例: 表pg_akun,id_akun数字2。无法将id_key输入到pg_trans表中。因为数字2在parent_id_key中 但是对于ID号3,可以将id_key输入到pg_trans表中。因为数字3不在parent_id_akun

然后从两个表中可以得出结果:

  1. 总计是(数量*价格)
  2. total列还将每个parent_id_akun的总和相加,并将结果放入求和的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。

  1. id_akun 24,从pg_trans获得。所以找到id_akun 24的总价值是(数量*价格)
  2. 然后计算id_akun 22,然后通过查看与id_akun为22相同的parent_id_akun,然后将整个parent_id_akun 22加起来。

问题是如何使用性能良好的mysql查询来做到这一点。 因为到目前为止,我使用的查询多达1116行,并将它们放入存储过程中。

对不起,我无法在此处输入查询,因为它超出了此处的最大帖子数限制

0 个答案:

没有答案