【问题标题】:Update Query with LEFT JOIN , Variable and Autoincrement Using MySQL使用 MySQL 使用 LEFT JOIN、变量和自动增量更新查询
【发布时间】:2013-02-22 21:00:17
【问题描述】:

我陷入了困境。这是表结构。

default_category

category_id | parent_id |   name                | symbol 
-----------------------------------------------------------
    1       |   1       |   SMT Equipment       |   SMT
    2       |   1       |   ATE & INSPECTION    |   ATE
    3       |   1       |   Feeders             |   FED
    4       |   1       |   Rework Station      |   RWS
    5       |   1       |   X-Ray Machines      |   XRM

default_products

id  | subcategory_id | product_name | product_code
---------------------------------------------------
1   |   1           |   A           |   null
2   |   1           |   B           |   null
3   |   2           |   C           |   null
4   |   2           |   D           |   null
5   |   1           |   E           |   null
6   |   3           |   F           |   null
7   |   4           |   G           |   null
8   |   1           |   H           |   null
9   |   2           |   I           |   null    

default_products_code

id  | category_id | code    
-------------------------
1   |       1     | 1   
2   |       2     | 1       
3   |       3     | 1   
4   |       4     | 1       
5   |       5     | 1

现在是细节

每当创建一个类别时,我都会在 default_products_code 中输入一个条目 并提供 code = 1 作为默认值。现在,每当插入产品时 我从 default_products_code 获取代码,从 default_category 获取符号 并为产品A制作这样的代码,例如代码是SMT0001 然后我将 default_products_code 中的代码更新为 2 因为 1 已经 在 product_code 中分配。这就是我目前的系统。但是现在的问题 我的数据库中有数百种产品,我必须更新 我解释了具有上述标准的新添加列。

这是我尝试使用自动增量的查询

SET @var := 1;
UPDATE default_products AS dp
LEFT JOIN(
            SELECT 
                dc.category_id,
                CONCAT(symbol, LPAD(@var,5,'0')) AS `code`,
                @var := @var+1
            FROM default_products AS dp
            LEFT JOIN default_category AS dc ON dc.category_id = dp.subcategory_id
            WHERE subcategory_id = 1
        ) AS l ON l.category_id = dp.subcategory_id 
SET part_code = l.code
WHERE subcategory_id = 1;

它产生这个结果

id  | subcategory_id | product_name | product_code
---------------------------------------------------
1   |   1           |   A           |   SMT00001
2   |   1           |   B           |   SMT00001
5   |   1           |   E           |   SMT00001
8   |   1           |   H           |   SMT00001

虽然我需要这个

id  | subcategory_id | product_name | product_code
---------------------------------------------------
1   |   1           |   A           |   SMT00001
2   |   1           |   B           |   SMT00002
5   |   1           |   E           |   SMT00003
8   |   1           |   H           |   SMT00004

另一件事我需要更新表中的所有产品。 我怎样才能在一个查询中做到这一点。我知道我需要删除 WHERE subcategory_id = 1 在这种情况下,但我无法继续。

【问题讨论】:

  • 您应该在上一个问题中回到我的查询解决方案 :)
  • 在 SELECt 中有帮助,但在更新中没有帮助,我已经尝试过
  • 您是否在查询中查找字符串修改,以根据您的 id 设置 product_code?类似dev.mysql.com/doc/refman/5.1/en/…

标签: mysql left-join auto-increment


【解决方案1】:

你的问题是LPAD

LPAD 是这样定义的

   LPAD(str, len, padstr) 

在你的查询中你应该这样使用

 LPAD(id, 5, 0) 

在您的查询 LPAD(@var,5,'0') 中,它将始终返回 00001,因为 @var 是 1

【讨论】:

  • 是的,但为什么在我的查询中 @var := @var+1 没有任何效果?
  • 你不需要这个@var := @var+1 只需删除它
  • 你根本不需要那个变量$var,它将跟随id
  • LPAD(id, 5, 0) 看,它会自动跟随 id 所以你不需要放变量
  • 我提供了 id 作为示例数据。产品可能按任何顺序排列,中间缺少一些 id 我该怎么办?例如 1 ,2 3, 10 , 16, 100。在这种情况下,我不能使用 id。
【解决方案2】:

经过一些修改,我找到了方法。

SET @var := 0;
UPDATE default_products AS dp
LEFT JOIN(
        SELECT 
        dc.category_id,
        dc.symbol
        FROM default_products AS dp
        LEFT JOIN default_category AS dc ON dc.category_id = dp.subcategory_id
        WHERE subcategory_id = 16
        group by dp.id            
    ) AS l ON l.category_id = dp.subcategory_id 
SET part_code = CONCAT(l.symbol, LPAD(@var := @var+1,5,'0'))
WHERE subcategory_id = 16;

我已经完成了代码创建,它完全按照我的需要工作。我仍然想用 删除了 where 条件,以便我可以更新所有产品。

【讨论】:

  • @BillKarwin 你能帮我解决这个问题吗
  • @JW 你能帮我解决这个问题吗?我想更新所有我知道每次选择新组时我都必须将变量重置为 0 的记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多