1

カテゴリ、サブカテゴリ、および製品のデータベースがあります。多くのサブカテゴリとその製品が親カテゴリに採用されていないため、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 ステートメントを機能させることができません。

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

私が探しているのは基本的に次のとおりです。

  1. カテゴリ = 12 の id_product を取得します
  2. 取得した各 id_product について、カテゴリが 143 に等しい行を作成します
  3. カテゴリ = 143 の位置で最も高い int を取得し、+1 します

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

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

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

+============+=============+==========+
| 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 で行われます)。

4

1 に答える 1

1

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       |
+------------+-------------+----------+
于 2020-11-25T11:23:55.263 に答える