SQL同じテーブルの各フィールドの新しい行をテーブルに挿入します

Nov 25 2020

カテゴリ、サブカテゴリ、製品のデータベースがあります。多くのサブカテゴリ、したがってそれらの製品は親カテゴリに採用されなかったため、SQLを使用してこれを修正しようとしていますが、いくつかの問題が発生しています。

このテーブルには3つの列があります。id_category、id_product、position(これらはすべてintです)このテーブルでは、製品がカテゴリに含まれるたびに、指定されたカテゴリのid_categoryごとにそのid_productに対して繰り返されます。それが親かサブカテゴリか。

例として、子カテゴリは12で、親カテゴリは143であると言えます。

これまで私が試したことは

SELECT id_product FROM category_products WHERE id_category = 12

これにより、新しい行を作成したい製品が得られますが、INSERTステートメントを機能させることができません。

次に、位置も問題になります。これは、最後の最大の番号を選択し、カテゴリ内の製品の位置であるため、各フィールドに+1を追加する必要があるためです。

私が探しているのは基本的に:

  1. カテゴリ= 12のid_productを取得します
  2. 取得したid_productごとに、categoryが143に等しい行を作成します
  3. カテゴリ= 143の位置で最高の整数を取り、それに+1を実行します

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

+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190        | 12          | 10       |
+------------+-------------+----------+
| 191        | 12          | 11       |
+------------+-------------+----------+
| 230        | 12          | 12       |
+------------+-------------+----------+
| 15         | 143         | 12       |
+------------+-------------+----------+
| 150        | 143         | 50       |
+------------+-------------+----------+

SQLの後、それは次のようになります

+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190        | 12          | 10       |
+------------+-------------+----------+
| 191        | 12          | 11       |
+------------+-------------+----------+
| 230        | 12          | 12       |
+------------+-------------+----------+
| 15         | 143         | 12       |
+------------+-------------+----------+
| 150        | 143         | 50       |
+------------+-------------+----------+
| 190        | 143         | 51       |
+------------+-------------+----------+
| 191        | 143         | 52       |
+------------+-------------+----------+
| 230        | 143         | 53       |
+------------+-------------+----------+

いくつかの異なる構文とすべてを試しましたが、常にエラーが返されるだけです。(ちなみに、これはPHPMyAdminで行われます)。

回答

1 SlavaRozhnev Nov 25 2020 at 11:23

MySQL 8.0以降の場合、次のクエリを使用できます。

INSERT IGNORE INTO products
SELECT 
    id_product,
    143 as id_category,
    (
       SELECT MAX(position) 
       FROM products
       WHERE id_category = 143
     ) + 
     (row_number() over (order by id_product)) as position
FROM products
WHERE id_category = 12;

SQLize.onlineの結果:

+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190        | 12          | 10       |
+------------+-------------+----------+
| 191        | 12          | 11       |
+------------+-------------+----------+
| 230        | 12          | 12       |
+------------+-------------+----------+
| 15         | 143         | 12       |
+------------+-------------+----------+
| 150        | 143         | 50       |
+------------+-------------+----------+
| 190        | 143         | 51       |
+------------+-------------+----------+
| 191        | 143         | 52       |
+------------+-------------+----------+
| 230        | 143         | 53       |
+------------+-------------+----------+