SQL Insérer dans la table de nouvelles lignes pour chaque champ de la même table
J'ai une base de données de catégories, sous-catégories et produits. De nombreuses sous-catégories et donc leurs produits n'ont pas été adoptés par les catégories parentes, j'essaie donc d'utiliser SQL pour résoudre ce problème, mais je rencontre quelques problèmes.
Ledit tableau comporte trois colonnes; id_category, id_product, position (ils sont tous entiers) Dans ce tableau chaque fois qu'un produit est dans une catégorie, il est répété pour cet id_product pour chaque id_category de catégories données. Que ce soit parent ou sous-catégorie.
Comme exemple, on peut dire que la catégorie enfant est 12 alors que la catégorie parent est 143
Jusqu'à présent, ce que j'ai essayé est
SELECT id_product FROM category_products WHERE id_category = 12
Cela me donne les produits qui m'intéressent pour créer de nouvelles lignes mais je ne parviens pas à faire fonctionner l'instruction INSERT.
Deuxièmement, la position est également un problème car je dois sélectionner le dernier numéro le plus élevé et pour chaque champ, ajouter un +1, car il s'agit de la position du produit dans la catégorie.
Ce que je recherche, c'est essentiellement:
- Prenez id_product où category = 12
- Pour chaque id_product pris, créez une ligne où la catégorie est égale à 143
- Prenez le plus haut int en position où category = 143 et faites-lui +1
Par conséquent, nous avons quelque chose comme ceci:
+============+=============+==========+
| id_product | id_category | position |
+============+=============+==========+
| 190 | 12 | 10 |
+------------+-------------+----------+
| 191 | 12 | 11 |
+------------+-------------+----------+
| 230 | 12 | 12 |
+------------+-------------+----------+
| 15 | 143 | 12 |
+------------+-------------+----------+
| 150 | 143 | 50 |
+------------+-------------+----------+
APRÈS LE SQL, CELA SERAIT COMME
+============+=============+==========+
| 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 |
+------------+-------------+----------+
J'ai essayé plusieurs syntaxes différentes et tout, mais cela ne me renvoie que des erreurs tout le temps. (Cela se fait dans PHPMyAdmin d'ailleurs).
Réponses
Dans le cas de MySQL 8.0 ou version ultérieure, vous pouvez utiliser la requête suivante:
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;
Résultat de 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 |
+------------+-------------+----------+