Pobranie rekordów rekurencyjnie

0

Witam serdecznie,

Przejdę od razu do sedna sprawy. Mam następujące tabele:
PRODUKTY
//Id_produkty
Id_sklep_kategorie
Nazwa
etc...//

SKLEP_KATEGORIE
//Id_sklep_kategorie
Id_rodzic (powiązanie z Id_sklep_kategorie, ponieważ jedna kategoria może być kategorią podrzędną innej)
Nazwa//

Chciałbym teraz wyciągnąć wszystkie produkty, które należą dajmy na to do Id_sklep_kategorie = 10. Tylko że wpisując normalny warunek, tj.

SELECT * FROM PRODUKTY WHERE Id_sklep_kategorie = 10;

dostaję puste wyniki, ponieważ produkty fizycznie należą do kategorii nr 11, której rodzicem jest kategoria nr 10. Dlatego potrzebowałbym uniwersalnego zapytania, dzięki któremu wyciągnę wszystkie produkty których podkategorie należą do kategorii nr 10.

Nie wiem jak się za to zabrać, nie robiłem jeszcze takich zapytań (albo robiłem ale nieświadomie?).

Pozdrawiam i liczę na pomoc! :)

0

Najprościej:
SELECT * FROM PRODUKTY WHERE Id_sklep_kategorie IN (SELECT Id_rodzic FROM SKLEP_KATEGORIE WHERE Id_sklep_kategorie = 10)

SELECT * FROM PRODUKTY WHERE Id_sklep_kategorie IN (SELECT Id_sklep_kategorie FROM SKLEP_KATEGORIE WHERE Id_rodzic = 83) OR Id_sklep_kategorie = 83; 

Podzapytanie wyciągnie Ci wszystkie "podkategorie" głównej kategorii.
Jeżeli główna kategoria w Id_rodzic ma NULL to można dopisać jeszcze OR Id_sklep_kategorie = 10 (bo inaczej nie pokaże produktów należących do tej grupy)

0

Ok fajnie, tylko że tak:

SELECT * FROM PRODUKTY WHERE Id_sklep_kategorie IN (SELECT Id_rodzic FROM SKLEP_KATEGORIE WHERE Id_sklep_kategorie = 10) OR Id_sklep_kategorie = 10;

Zapytanie te wyciąga produkty dobrze, pod warunkiem, że należą one bezpośrednio pod kategorię nr 10. Natomiast jak należą do kategorii 8, która jest podkategorią kategorii 9, która z kolei jest podkategorią kategorii 10 to zapytanie mi zwraca 0 produktów.

0

Problemem jest to, że chyba nie do końca te podzapytanie robi to co potrzeba:

SELECT Id_rodzic FROM SKLEP_KATEGORIE WHERE Id_sklep_kategorie = 10

Ono zwraca mi rodzica tej kategorii, a ja potrzebuję pójść w drugą stronę, czyli pobrać wszystkie podkategorie tej kategorii.

Wystarczy przestawić warunek i selecta :)

SELECT * FROM PRODUKTY WHERE Id_sklep_kategorie IN (SELECT Id_sklep_kategorie FROM SKLEP_KATEGORIE WHERE Id_rodzic = 83) OR Id_sklep_kategorie = 83;
  • robi to co trzeba :)

Dziękuję hipekk za pomoc :)

0

Ale od razu zauważyłem jeszcze jeden problem.

Mam np główną kategorię nr 108. Zapytanie zwraca mi jedynie 7 produktów, gdzie faktycznie jest ich ponad 200. Zauważyłem, że podzapytanie

SELECT Id_sklep_kategorie FROM SKLEP_KATEGORIE WHERE Id_rodzic = 108

zwraca mi 7 kategorii. I najwidoczniej te zapytanie sprawdza już bezpośrednio produkty w tych podkategoriach. A niektóre z tych podkategorii mają jeszcze kilka podrzędnych kategorii. I tam zapytanie już nie zagląda :/

0

przy zagłębieniach np. 4 poziomu to ja Ci po prostu współczuję :). BTW MySQL nie dorobił się hierarchicznych zapytań. Zobacz sobie to http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ powinno Ci pomóc

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