SQL 동일한 테이블의 각 필드에 대한 새 행을 테이블에 삽입

Nov 25 2020

카테고리, 하위 카테고리 및 제품 데이터베이스가 있습니다. 많은 하위 범주와 그에 따른 제품이 상위 범주에 의해 채택되지 않았으므로 SQL을 사용하여이 문제를 해결하려고하지만 몇 가지 문제가 있습니다.

상기 테이블에는 세 개의 열이 있습니다. id_category, id_product, position (모두 정수임)이 테이블에서는 제품이 카테고리에 속할 때마다 주어진 카테고리의 각 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에 대해 카테고리가 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이 비슷 해지면

+============+=============+==========+
| 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       |
+------------+-------------+----------+