【问题标题】:Update from INNER JOIN specific ids but all were updated从 INNER JOIN 特定的 id 更新,但都已更新
【发布时间】:2020-04-30 06:29:18
【问题描述】:

目前,我正在尝试实现一个餐厅应用程序。在数据库中,我有category 表和item 表,一个类别必须有很多项目,一个项目必须有一个类别,所以这是一对多关系,我想在类别没有时更新一些类别记录如果 qty on hand = 0 类别 status 应更新为 "deactivated" 这些是我的表格,则表示项目的项目

+-------+----------+-------------------+
| CatId | status   | catagory          |
+-------+----------+-------------------+
| C001  | Deactive | SeaFood           |
| C002  | Deactive | ITALIAN & western |
| C003  | Active   | Kottu             |
| C004  | Active   | Rice              |
+-------+----------+-------------------+


+--------+-------+--------+-----------+-----------------+------------+----------+
| ItemId | CatId | Price  | QtyOnHand | iteamName       | Date       | Time     |
+--------+-------+--------+-----------+-----------------+------------+----------+
| I001   | C003  | 650.00 |        30 | chease kottu    | 2020-04-26 | 19:55:59 |
| I002   | C003  | 650.00 |        25 | vgetable kottu  | 2020-04-26 | 19:55:59 |
| I003   | C003  | 450.00 |         3 | chicken koththu | 2020-04-27 | 08:32:12 |
+--------+-------+--------+-----------+-----------------+------------+----------+

这是我目前尝试过的查询。

UPDATE catagory  INNER JOIN item  ON catagory.CatId = item.CatId SET catagory.`status` = "deactivated"
WHERE ((SELECT SUM(item.QtyOnHand)) >= 0);

此查询更新项目表中的所有类别CatId 作为初学者,对于MySQL,我需要一些帮助。

【问题讨论】:

  • 条件中有>= 0,这和“if qty on hand = 0”不一样...
  • 我也试过< 0
  • 但是考虑存储容易派生的数据是否真的明智

标签: mysql inner-join


【解决方案1】:

只需在子查询中添加where 子句并根据需要过滤它们。 像这样。

UPDATE catagory INNER JOIN item ON catagory.CatId  = item.CatId 
SET catagory.status ="deactivated"
WHERE (SELECT SUM(item.QtyOnHand) where catagory.CatId  = item.CatId GROUP By item.CatId) <= 0 ; 

【讨论】:

    【解决方案2】:

    对于 sum = 0 的 catid,您可以在子查询上使用 update with join

        update catagory
        inner join  (
             select catagory.CatId,   SUM(ifnull(item.QtyOnHand,0)) tot
             from catagory 
             left join item ON item.CatId = catagory.CatId
             group by catagory.CatId
             having SUM(ifnull(item.QtyOnHand,0)) = 0
        ) t on t.CatId = catagory.CatId 
        set catagory.`status` = "deactivated"
    

    【讨论】:

      【解决方案3】:

      试试这样的:

      UPDATE catagory
        INNER JOIN item  ON catagory.CatId = item.CatId
        SET catagory.`status` = "deactivated"
        WHERE COALESCE(SUM(item.QtyOnHand), 0) = 0;
      

      WHERE 子句中的 SELECT 没有过滤。还添加了 COALESCE() 以停用任何没有项目的类别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        相关资源
        最近更新 更多