[Pętle] Automatyczne sumowanie

0

W tabeli cats istotne są pola:

ID || SC (ID wyższej kategorii) || NUM (liczba pozycji w danej kategorii i jej podkategoriach)

Zawartość (arty, newsy, itp.) znajdują się w tabelach arts, news, itd.

Dla przykładu istnieje drzewo kategorii:

Kat. główna 1
|-- Subk. 2
|-- Subk. 3
|-----Subk. kolejnego poziomu 4

Subkategorii może być (nieskończenie) wiele.

Na przykład dodaję lub usuwam artykuł w kategorii 4. Ilość zawartości powinna zostać zaaktualizowana (najlepiej poprzez dodanie lub odjęcie 1 do pola NUM kategorii 4 oraz wyższych). Jak to zrobić?

Czy w języku SQL można stosować pętle?

Jeśli nie da się tego zrobić na poziomie zapytania SQL, rozwiążę problem inaczej.

Ewentualnie możliwe jest pobranie danych o istotnych kategoriach za 1 razem, stosując inne polecenia SQL?

0

Jaki sql?

Mozna to zrobic jednym zapytaniem, np. mssql:

update cats set num = num + 1 where sc >= 4

i tak, mozna stosowac petle zazwyczaj, ale nie jestem pewien czy we wszystkich serwerach (mssql na pewno, mysql chyba tez).

0

SC przechowuje ID wyższej kategorii. Powyższe zapytanie zwiększy liczbę ilości zawartości o 1 kategoriom, których ID nadrzędnej kategorii jest większe lub równe X. Skąd to wiadomo?

Przykład skomplikowanej tabeli z istotnymi polami:

| ID || SC || NUM |
| 1. || P. || -5- |
| 2. || P. || -10 |
| 3. || 2. || -2- |
| 4. || 2. || -5- |
| 5. || 4. || -20 |

P = kategoria główna
Dla przykładu dodaję artykuł do kategorii o ID 5. Pole NUM zwiększa się o 1. Ponieważ nadrzędną kategorią jest 4, również tam trzeba dodać 1 do NUM. Kolejną nadkategorią jest 2, więc też pole NUM powinno się zwiększyć o 1. To tylko przykład! Wartości ID mogą być różne!

Mam nadzieję, że rozumiecie, o co tu chodzi. Skrypt jest nastawiony głównie na obsługę MySQL.

0

Zakladajac, ze zamiast 'P' jest null, to wypocilem cos takiego - teoretycznie powinno dzialac, praktycznie cos jeszcze jest nie tak. Ale chwilowo nie mam wiecej czasu:

mysql> delimiter //
mysql> create procedure updateNum(id int)
    -> begin
    -> declare nextID int;
    -> set nextID = id;
    -> select nextID;
    -> while nextID is not null do
    -> update tabela set num = num + 1 where id = nextID;
    -> select sc from tabela where id = nextID limit 1 into nextID;
    -> select nextID;
    -> end while;
    -> end
    -> //

Moze sie na cos przyda

0

A nie pomyślałeś, że by zamiast zwiększac pul i trzymać tychsamych danych w nieskończenie wielu miejscach po prostu w razie potrzeby zliczyć te artykuły ;]
...wiesz to się nazywa normalizacja i doprowadza do tego, że schematy relacji są prostrze i bardziej przejrzyste ;]

0

Czasem sie nie oplaca, jesli sumowanie trwa za dlugo. Ale fakt - dla paru danych bedzie ladniej :)

0
johny_bravo napisał(a)

Czasem sie nie oplaca, jesli sumowanie trwa za dlugo.

Ale On chyba mówi o bazie danych a nie hurtowni [???] ;]

0

Pewnie tak, ale w sumie to nie wiadomo do konca :)

0

po to ktoś wymyślił całe te bazy, żeby nie trzymać wszystkiego w 10 różnych miejscach tylko używać czegoś takiego jak SUM, MAX, MIN itp.
BTW jak już tak bardzo chcesz to mieć zapisane to poczytaj o czymś takim jak wyzwalacze a jak Twoja baza tego nie ma to znaczy, że nie można o niej mówi w kategorji baz danych (to do pytacza)

1 użytkowników online, w tym zalogowanych: 0, gości: 1