1

私は状況に行き詰まっています。これがテーブル構造です。

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

デフォルト製品

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 にエントリを作成し、コード = 1 をデフォルト値として提供します。製品が挿入されるたびに、default_products_code からコードを取得し、default_category からシンボルを取得して、たとえば製品 A のコードを次のように作成します。コードは SMT0001 で、product_code に 1 が割り当てられているため、default_products_code のコードを 2 に更新します。 . これが私の現在のシステムです。しかし、データベースに何百もの製品があり、新しく追加された列を上記の基準で更新する必要があるという問題が発生しました。

これは、自動インクリメントで試したクエリです

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

テーブル内のすべての製品を更新する必要があるもう 1 つのこと。単一のクエリでこれを行うにはどうすればよいですか。この場合、WHERE subcategory_id = 1 を削除する必要があることはわかっていますが、続行できません。

4

2 に答える 2

2

あなたの問題はLPAD

LPADはそのように定義されています

   LPAD(str, len, padstr) 

あなたのクエリでは、そのように使用する必要があります

 LPAD(id, 5, 0) 

クエリLPAD(@var,5,'0')では、常に 00001 を@var1として返します

于 2013-02-22T21:13:33.027 に答える
1

いくつかの変更の後、私はそれを行う方法を見つけました。

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 条件を削除して更新したいと考えています。

于 2013-02-22T21:37:37.507 に答える