SQL 为同一 table 中的每个字段插入 table 新行
SQL Insert into table new rows foreach field in same table
我有一个类别、子类别和产品的数据库。许多子类别及其产品未被父类别采用,因此我尝试使用 SQL 来解决此问题,但我遇到了一些问题。
表示table有三列; id_category, id_product, 位置(都是整数)
在此 table 中,每次产品属于某个类别时,都会针对给定类别的每个 id_category 重复该 id_product。无论是父类别还是子类别。
举个例子,我们可以说子类别是 12,而父类别是 143
到目前为止我尝试过的是
SELECT id_product FROM category_products WHERE id_category = 12
这确实为我提供了我有兴趣创建新行的产品,但我无法使 INSERT 语句工作。
其次,位置也是一个问题,因为我需要 select 最后一个最大的数字,并为每个字段添加 +1,因为它是产品在类别中的位置。
我要找的基本上是:
- 取id_product where category = 12
- 对于每个 id_product 采取的行,其中类别等于 143
- 在 category = 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 中完成的)。
如果 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 |
+------------+-------------+----------+
我有一个类别、子类别和产品的数据库。许多子类别及其产品未被父类别采用,因此我尝试使用 SQL 来解决此问题,但我遇到了一些问题。
表示table有三列; id_category, id_product, 位置(都是整数) 在此 table 中,每次产品属于某个类别时,都会针对给定类别的每个 id_category 重复该 id_product。无论是父类别还是子类别。
举个例子,我们可以说子类别是 12,而父类别是 143
到目前为止我尝试过的是
SELECT id_product FROM category_products WHERE id_category = 12
这确实为我提供了我有兴趣创建新行的产品,但我无法使 INSERT 语句工作。
其次,位置也是一个问题,因为我需要 select 最后一个最大的数字,并为每个字段添加 +1,因为它是产品在类别中的位置。
我要找的基本上是:
- 取id_product where category = 12
- 对于每个 id_product 采取的行,其中类别等于 143
- 在 category = 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 中完成的)。
如果 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 |
+------------+-------------+----------+