SQL Neue Zeilen für jedes Feld in derselben Tabelle in die Tabelle einfügen
Ich habe eine Datenbank mit Kategorien, Unterkategorien und Produkten. Viele Unterkategorien und daher ihre Produkte wurden nicht von den übergeordneten Kategorien übernommen. Daher versuche ich, dies mithilfe von SQL zu beheben, stoße jedoch auf einige Probleme.
Diese Tabelle hat drei Spalten; id_category, id_product, position (alle sind ints) In dieser Tabelle wird jedes Mal, wenn sich ein Produkt in einer Kategorie befindet, für dieses id_product für jede id_category bestimmter Kategorien wiederholt. Ob das nun Eltern oder Unterkategorie ist.
Als Beispiel können wir sagen, dass die untergeordnete Kategorie 12 ist, während die übergeordnete 143 ist
Bisher habe ich versucht,
SELECT id_product FROM category_products WHERE id_category = 12
Dies gibt mir die Produkte, an denen ich interessiert bin, neue Zeilen zu erstellen, aber ich kann die INSERT-Anweisung nicht zum Laufen bringen.
Zweitens ist die Position ebenfalls ein Problem, da ich die letzte, höchste Zahl auswählen und für jedes Feld eine +1 hinzufügen muss, da dies die Position des Produkts in der Kategorie ist.
Was ich suche ist im Grunde:
- Nehmen Sie id_product mit category = 12
- Machen Sie für jedes aufgenommene id_product eine Zeile, in der die Kategorie gleich 143 ist
- Nehmen Sie das höchste int in Position, in der Kategorie = 143 ist, und geben Sie +1 ein
Deshalb haben wir so etwas:
+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190 | 12 | 10 |
+------------+-------------+----------+
| 191 | 12 | 11 |
+------------+-------------+----------+
| 230 | 12 | 12 |
+------------+-------------+----------+
| 15 | 143 | 12 |
+------------+-------------+----------+
| 150 | 143 | 50 |
+------------+-------------+----------+
Nach dem SQL würde es so sein
+============+=============+==========+
| 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 |
+------------+-------------+----------+
Ich habe verschiedene Syntaxen und alles ausprobiert, aber es werden immer nur Fehler an mich zurückgegeben. (Dies geschieht übrigens in PHPMyAdmin).
Antworten
Im Fall von MySQL 8.0 oder höher können Sie die nächste Abfrage verwenden:
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;
Ergebnis von 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 |
+------------+-------------+----------+