SQL Wstaw do tabeli nowe wiersze dla każdego pola w tej samej tabeli

Nov 25 2020

Posiadam bazę kategorii, podkategorii i produktów. Wiele podkategorii, a tym samym ich produkty, nie zostało zaadoptowanych przez kategorie nadrzędne, więc próbuję użyć SQL, aby to naprawić, ale napotykam pewne problemy.

Wspomniana tabela ma trzy kolumny; id_category, id_product, position (wszystkie są typu int) W tej tabeli za każdym razem, gdy produkt znajduje się w kategorii, jest on powtarzany dla tego id_product dla każdej id_category podanych kategorii. Czy będzie to kategoria nadrzędna czy podkategoria.

Na przykład możemy powiedzieć, że kategoria podrzędna to 12, a kategoria rodzicielska to 143

Jak dotąd próbowałem

SELECT id_product FROM category_products WHERE id_category = 12

To daje mi produkty, które jestem zainteresowany do tworzenia nowych wierszy, ale nie mogę sprawić, by instrukcja INSERT działała.

Po drugie, problemem jest również pozycja, ponieważ muszę wybrać ostatnią, najwyższą liczbę i dla każdego pola dodać +1, ponieważ jest to pozycja produktu w kategorii.

Zasadniczo szukam:

  1. Weź id_product, gdzie category = 12
  2. Dla każdego wziętego id_product utwórz wiersz, w którym kategoria jest równa 143
  3. Zajmij najwyższą int na pozycji, gdzie category = 143 i zrób jej +1

Dlatego mamy coś takiego:

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

PO SQL BYŁOBY TAK JAK

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

Wypróbowałem kilka różnych składni i wszystkiego, ale cały czas tylko zwraca mi błędy. (Nawiasem mówiąc, odbywa się to w PHPMyAdmin).

Odpowiedzi

1 SlavaRozhnev Nov 25 2020 at 11:23

W przypadku MySQL 8.0 lub nowszego możesz użyć następnego zapytania:

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;

Wynik z 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       |
+------------+-------------+----------+