如何基于同一数据库中的另一个值更改mysql中的值?

问题描述

我试图根据相同数据库但不同表中的另一个值来更改数据库中表中的一个值。第一个表称为订单,第二个表称为购买供应。我想做的是我想通过从“订单”表中名为“ quantity_ordered”的列中减去一个值来更改“购买”表中的求和值。我尝试编写一些查询,但是它不起作用,它不断弹出错误。如果您知道解决方案,请告诉我。代码也在下面

private void DispatchButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               

        String type = txttype.getSelectedItem().toString();
        String name = txtname.getText();
        String quantity = txtquantity.getText();
        String dispatch_row = txtdispatch.getText();
        String statusDispatched = "Dispatched";
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con1 = DriverManager.getConnection("jdbc:mysql://localhost/restock","root","password");


            // Focus on this 
            String template = "UPDATE orders SET status = '%s' WHERE id = %s";
            String template2 = "UPDATE buysupply SET sumquantity = sumquantity - %s WHERE id = %s";
            String quantity_ordered = "quantity_ordered FROM orders";
            pst = con1.prepareStatement(String.format(template,statusDispatched,dispatch_row));   
            pst.executeUpdate();
            pst1 = con1.prepareStatement(String.format(template2,quantity_ordered,dispatch_row));
            pst1.executeUpdate();
            // Look on top


            JOptionPane.showMessageDialog(null,"Item has been dispatched");
            // To update the newly recorded data to the table
            table_update();
            // Set the textfields to empty upon button click
            txttype.setSelectedIndex(-1);
            txtname.setText("");
            txtquantity.setText("");
            txtdispatch.setText("");
            txttype.requestFocus();
            
        } catch (ClassNotFoundException | SQLException ex) {
            JOptionPane.showMessageDialog(null,"Quantity or Dispatch field is not an integer,Please try again.");
            Logger.getLogger(mainpage.class.getName()).log(Level.SEVERE,null,ex);
        }
    }  


// This code is in another class file
try {
            Class.forName("com.mysql.jdbc.Driver");
            con1 = DriverManager.getConnection("jdbc:mysql://localhost/restock","password");
            String template = "SELECT SUM(quantity) as sumquantity FROM buysupply WHERE itemtype IN ('Plastic gloves','Rubber gloves')";
            PreparedStatement pst = con1.prepareStatement(template);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {
                glovesum = rs.getString("sumquantity");
            } else {
                System.out.print("Query didn't return any results");
            }

        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(stock.class.getName()).log(Level.SEVERE,ex);
        }

enter image description here

enter image description here

解决方法

据我了解(请仔细阅读直至最后),如果它是经典的发票订购数据库,并且在“购买”表和“订购”表中列出了用于订购产品的客户列表的产品。 第一点,进入注释点的是几个人,两个表之间都缺少链接数据。我假定您读完代码后就知道链接是由ID构成的,但不清楚,因此我基于这些列之间的链接提供了一种解决方案:

orders.itemtype = buysupply.itemtype

如果在其他元素上,请将信息更改为下面的SQL查询。 我还假设将orders.status列的值从我所谓的“等待”值更改为“已调度”值。

因此这里的数据先放入“ buysupply”表:

id,itemtype,quantity
1,mask,704
2,clothed,101
3,N95,18

将数据放入“订单”表之前:

id,quantity_orderred,status,1,Dispatched
2,3,Waiting

用于更新两个值(orders.status和buysupply.quantity)的SQL应该类似于这样,假设要更新的order.id为2:

update orders,buysupply 
set orders.status='Dispatched',buysupply.quantity = buysupply.quantity - orders.quantity_orderred
where  
orders.itemtype = buysupply.itemtype
AND
orders.status = 'Waiting'
AND
orders.id = '2'

之后: 因此这里的数据进入“ buysupply”表后:

id,98
3,Dispatched

此更新可能适用于多个表和列,您应该只在每个列中指定列表名称,以免造成混淆。

这可能是让您改进求和部分代码的第一步,恐怕一点都不了解。

然后我发现了一个部分信息,该信息说明sum_quantity是根据值的总和计算得出的计算结果,所以您不想更改数量,我很糟糕。

因此,您可以使用这种SQL创建临时表,该临时表在连接关闭时会受到破坏:

CREATE TEMPORARY TABLE IF NOT EXISTS TMPsumquantity AS 
  SELECT SUM(quantity) as sumquantity FROM buysupply WHERE itemtype IN ('Plastic gloves','Rubber gloves') 

这可能会创建一个包含所需信息的列,但据我所知,这不是我的建议;-)

我将创建一个新列,以将总和值存储到表“ buysupply”中,例如:“此订单将被分派的当前可用库存数量是该元素的数量”,因此您求和的结果值

在“购买”之前: ID,项目类型,数量,数量 1,面具,704,704 2,着装,101,101 3,N95、18、18

在“订购”之前: ID,项目类型,数量订购,状态,数量 1,口罩,1,派遣 2,衣服,3,等待中

因此,基于同一表之间的内部联接,创建此列的SQL很复杂

UPDATE buysupply b1
INNER JOIN (
  SELECT SUM(quantity) as sumquantity,id
  FROM buysupply
  where  buysupply.itemtype  IN ('clothed','N95')       
) b2 ON true
SET b1.quantity_avalaible = b2.sumquantity

因此,新表“ buysupply”的列为“ quantity_avalaible”,其中包含N95的列数和衣服值的总和:

id,quantity,quantity_avalaible 
1,704,116
2,101,116
3,18,116

因此,您可以使用第一个SQL建议来根据“ orders.quantity_orderred”的值更新quantity_avalaible

最后一点,我对数据结构和业务逻辑有部分了解,将负值存储到“ orders.quantity_orderred”列中可能很有用,因此SQL SUM可以通过相同的调用添加和减去值到SUM函数

最佳

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...