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

Posted

技术标签:

【中文标题】如何根据同一数据库中的另一个值更改mysql中的值?【英文标题】:How to change value in mysql based on another value in the same database? 【发布时间】:2020-08-12 08:41:27 【问题描述】:

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

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", "root", "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, null, ex);
        

【问题讨论】:

“我想通过从 orders 表中减去名为 quantity_ordered 的列来更改订单中 sumquantity 的值。”这是什么意思? sumquantityquantity_ordered 在同一个 orders 表中? 不,sumquantity 在 buysupply 表中,quantity_ordered 在 orders 表中 对不起,我写得不好请看帖子 Agn 不要存储从其他值计算的值。改为创建视图,您将避免数据不一致! 您好,我不知道如何创建视图,我需要尽快解决这个问题,我很快就会有截止日期 【参考方案1】:

据我了解(请阅读到最后),如果它是一个经典的发票订单数据库,其中包含产品列表的“buysupply”表和“订单”表中的产品订购客户列表。 第一点,几个人进的评论点是两个表之间缺少的链接数据。我假设阅读您的代码和平,该链接是由一个 ID 建立的,但不清楚,所以我提供了一个基于这些列之间的链接的解决方案:

orders.itemtype = buysupply.itemtype

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

所以这里将之前的数据放入“buysupply”表中:

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

这里将之前的数据放入“订单”表中:

id, itemtype, quantity_orderred,  status, 
1,mask, 1 , Dispatched
2,clothed,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, itemtype, quantity
1 , mask , 704
2 , clothed, 98
3 , N95, 18

这里将之前的数据放入“订单”表中:

id, itemtype, quantity_orderred,  status, 
1,mask, 1 , Dispatched
2,clothed,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, itemtype, 数量, quantity_avalaible 1、口罩、704、704 2、穿衣服、101、101 3、N95、18、18

在“订购”之前: id, itemtype, quantity_orderred, status, quantity_avalaible 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, itemtype, quantity, quantity_avalaible 
1 , mask , 704, 116
2 , clothed, 101, 116
3 , N95, 18, 116

那么你可以使用第一个 SQL 提议来根据“orders.quantity_orderred”的值更新quantity_avalaible

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

最好的

【讨论】:

以上是关于如何根据同一数据库中的另一个值更改mysql中的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AlamoFireObjectMapper 动态映射 JSON 中的值,该值取决于同一 JSON 中的另一个值?

如何根据MySQL中的另一列有条件地选择列

如何将约束添加到 MYSQL 中的列仅以保存已存在于同一表的另一列中的值? [复制]

根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427

如何从同一平面列表中的另一个项目更改平面列表中项目的状态?

TSQL - 如何在插入之前根据不同列中的值检查值?