1

ProductID と Accessories 列を含むジャンクション テーブルがあります。

表1

ProductID    Accessory
1            2
1            3  
2            1
2            4
2            5
3
4            1
5            2

これは、ProductID 2 の場合、Accessory ProductID 1、4、および 5 があることを意味します ...

下の表 2 は、GRP と ProductID が既に提供されているように見えます。アクセサリを取得する必要があります。

表2

GRP     ProductID     accessories 
a       2             
b       3             
c       1             
d       4             
e       5 

したがって、実際にUPDATEを使用すると、次のようになります

表2

UPDATE table2 t2
set t2.accessories = (SELECT GROUP_CONCAT(DISTINCT t1.Accessory) FROM table1 t1
                      WHERE t1.ProductID = t2.ProductID)

GRP     ProductID     accessories
a       2             1,4,5
b       3              
c       1             2,3
d       4             1
e       5             2

しかし、最終テーブルがこのようになるように、t2.ProductID に従って、代わりに GRP 文字を使用して t2.accessories の productIDs を変更したいと考えています。

表2

GRP     ProductID     accessories
a       2             c,d,e
b       3              
c       1             a,b
d       4             c
e       5             a

ここにテーブルがありますhttp://sqlfiddle.com/#!9/83ec9

4

2 に答える 2

0

これはあなたのために働くはずです:

UPDATE table2 T
SET T.accessories = IFNULL((SELECT foo FROM
                        (SELECT t1.ProductID,GROUP_CONCAT(t2.GRP) as foo
                            FROM table1 t1 
                            LEFT JOIN table2 t2 ON t1.Accessory = t2.ProductID 
                            GROUP BY t1.ProductID
                        ) AS bar WHERE ProductID = T.ProductID
                     ),'')

更新されたSQL Fiddleは次のとおりです。

于 2015-06-19T19:17:45.777 に答える
0

テーブル 1 とテーブル 2 をリンクする 3 番目のテーブルが必要です。テーブル 2 のアクセサリ列は、最初の正規形 ( Database Normal Form ) を破っています。複数のデータを持つセルがあってはなりません。これにより冗長性が増し、個々のアクセサリを取り出して解析しないと取得できなくなります。

したがって、テーブル 1 には productID と GRP が含まれます。次に、アクセサリだけを含むアクセサリ テーブルが必要です。表 2 には、両方の主キー (productID、accessory) があります。それらを取り出すには、自然に 3 つすべてに参加するだけです。これにより冗長性が減り、アクセサリのない GRP と製品を持つことができます。

したがって、次のようになります。

表1

GRP

製品番号

表 2

製品番号

アクセサリー

表 3

アクセサリー

于 2015-06-19T19:31:21.137 に答える