Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie w tabeli z FK do siebie
Forum PHP.pl > Forum > Bazy danych
zaajcu
Cześć.
Mam dwie tabele jedna to kategorie_produktow, druga zaś to produkty

wyglądają tak:

kategorie_produktow

id | kategorie_produktow_id(FK) | nazwa
1 null Multimedia
2 1 Telewizory
3 1 Komputery
4 2 LCD
5 2 Plazma
6 3 Laptopy
7 3 Stacionarne



oraz produkty

id | kategorie_produktow_id(FK) | nazwa | opis | stan ...


potrzebuje wykonać zapytanie które zwróci mi podkategorie z wybranej kategorii wraz z ilością produktów w wszystkich podkategoriach podkategorii kategorii tongue.gif
np:

wybieram kategorie Multimedia (1)

zatem chciałbym aby wypisał mi kategorie:

Telewizory | ilosc produktow w Telewizory, LCD, Plazma (uwzględniając wszystkie kategorie poniżej kategori Telewizory
Komputery | komputery, laptopy, stacionarne

jedyny pomysł jaki na to mam to robienie tego na raty
- Najpierw pobranie danych o kategoriach
- potem stworzenie drzewa listy podrzędnych id
- a dopiero potem zapytanie SQL liczące ilość.

Może jest na to jakiś inny lepszy sposób niż wykonywanie x zapytań?
Crozin
1. Ilość produktów w danej kategorii (czy to z uwzględnieniem jej podkategorii czy bez) możesz bez problemu trzymać w dodatkowej kolumnie, której wartość zmienia się o jeden przy dodaniu/usunięciu produktu - nie będziesz musiał każdorazowo zliczać produktów.
2. Jeżeli skorzystałbyś z bardziej odpowiedniego dla RDBMS-ów modelu drzewa, np. popularny nested set, mógłbyś w zasadzie wybrać wszystko czego potrzebujesz jedynym, trywialnym (przy uwzględnieniu punktu #1) zapytaniem.
zaajcu
OK faktycznie inny model drzewa byłby lepsze (problem tylko w tym że tego nie znam i musiał bym się tego nauczyć)
wpadłem jeszcze na jeden pomysł:

dodać jeszcze jedną kolumnę z unikalnym nr (np SID) który składam by się z nr SID'u rodzica+własne id i np

id | SID | nazwa
1 1 Multimedia
2 12 Telewizory
3 123 Plazma
4 124 LCD
5 1235 LG
...


i wyszukiwać by można np tak:

  1. SELECT id FROM tab WHERE SID LIKE '12%'


i wówczas znajdzie mi wszystkie podkategorie telewizorów wraz z "Telewizory"

Co wy o tym myślicie?
nospor
nie: rodzica+własne id
a: rodzica+'/'+własne id

nie: 12
a: 1/2

Bo jak będziesz miał kategorię o ID 12 to będziesz miał problem wink.gif
zaajcu
A no tak racja wink.gif
Ale ogólnie koncepcja dobra?
nospor
Tak, to się tak poza tym nazywa bodajże "drzewka IP"
zaajcu
ok. Dzięki.
Teraz tylko jeszcze mam problem z uzupełnieniem aktualnego drzewka o ten SID mianowicie chce zrobić tak


  1. UPDATE kategorie SET sid = id WHERE kategorie_id IS NULL

to działa


  1. UPDATE kategorie k1 SET sid = concat((SELECT sid FROM kategorie WHERE id = k1.kategorie_id),'/',id) WHERE kategorie_id IS NOT NULL


to już nie działa mam komunikat:

You can't specify target table 'k1' for update in FROM clause
Crozin
Cytat
OK faktycznie inny model drzewa byłby lepsze (problem tylko w tym że tego nie znam i musiał bym się tego nauczyć)
Co zajmie Ci od kilku do kilkunastu minut (teoria). Następnych kilka(naście) minut poświęcisz na wdrożenie gotowych przykładów (odczytywania/wprowadzania danych do drzewa) do swojego projektu. Jestem niemal pewien, że pod każdym względem wyjdziesz na tym lepiej.
alegorn
dodam jedynie ze w zasadzie gotowych rozwiazan dla wiekszosci rozwiazan znajduje sie juz w sieci.

poczytaj teorie, wuguglaj skrypty - zaadoptuj i koniec.

dodam od siebie, iż jeśli chcesz sie bawic w programiste - to drzewa sa jednym z podstawowych struktur, i praktyczna wiedza na ich temat zawsze ci się przyda.

j.

ps. wyguglanie skryptu dla twojego problemu zajelo mi ok 15 sec.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.