Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie w MySQL i wyświetlanie produktów na podstawie "drzewa" kategorii
Forum PHP.pl > Forum > Bazy danych
trifek
Witam,
Mam taką bazę kategorii:
  1. CREATE TABLE IF NOT EXISTS `multikategorie` (
  2. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `parent_id` bigint(20) UNSIGNED NOT NULL,
  4. `position` bigint(20) UNSIGNED NOT NULL,
  5. `left` bigint(20) UNSIGNED NOT NULL,
  6. `right` bigint(20) UNSIGNED NOT NULL,
  7. `level` bigint(20) UNSIGNED NOT NULL,
  8. `title` text COLLATE utf8_unicode_ci,
  9. `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;


Najniższy poziom zagłębienia jaki mam to level = 12.

Chce zrobić:
- listę kategorii po kliknięciu której zobaczymy WSZYSTKIE produkty mieszczące się w wybranym parencie "w dół".

Czyli jeśli mamy np takie kategorie:
- Samochody
-- Osobowe
--- Skoda
----- Rapid
------- Części
-------- Elektronika
---------- Komputery
----- Octavia
----- SuperB
----- Fabia
--- Opel
--- Peugeot
--- Mazda

I ktoś kliknie np. w samochody - to wyświetlą mu się wszystkie produkty należące do kategorii "SAMOCHODY".
W momencie gdy klikniemy na "RAPID" to wyświetlą się nam produkty należące do kategorii: rapid / części / elektronika / komputery.

Mam taką bazę produktów:


  1. CREATE TABLE IF NOT EXISTS `produkty` (
  2. `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  4. `kategoria` bigint(20) DEFAULT NULL,
  5. `cena` double NOT NULL,
  6. UNIQUE KEY `id` (`bf_id`),
  7. FULLTEXT KEY `nazwa` (`nazwa`,`dostepnosc`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;



Próbowałem ten problem rozwiązać w ten sposób:
  1. $tablicaA = $ms->query_select("SELECT a.id, a.title, a.parent_id FROM multikategorie a, (SELECT b.id FROM multikategorie b, (SELECT id FROM multikategorie c WHERE c.id = " .($sqlzap) . ") AS foo WHERE b.parent_id = foo.id OR b.id = foo.id ) AS foo2 WHERE a.parent_id = foo2.id OR a.id = foo2.id GROUP BY a.id;");
  2. if (isset($tablicaA)) {
  3. $sssss .= " kategoria IN (";
  4. foreach ($tablicaA as $wynA => $warttA) {
  5. if ($warttA[parent_id] != "0") {
  6. $qwex = 1;
  7. $sssss .= " $warttA[id] , ";
  8. }}


Co w wyniku zwracało mi zapytanie do wyświetlania produktów:
  1. SELECT * FROM produkty WHERE cent <>'' AND ( kategoria IN ( 325193 , 325412 , 325461 ....... dziesiątki id ......... ) ) ORDER BY nazwa ASC


Wszystko byłoby okey gdyby nie to, że mam podgląd tylko do poziomu "niżej" - a nie od tego w którym się aktualnie znajduje -> "do końca".

I tak np. będąc w kategorii "RAPID" - nie mam produktów, ale już wchodząc do KOMPUTERY mam ich bardzo wiele.

Wie ktoś może jak zmienić powyższe zapytania aby całość była widoczna?

trifek
bardzo dziękuję za pomoc smile.gif

Mam jednak jeszcze jedno pytanie. Mam zapytanie z tego przykładu:

  1. SELECT title, id,
  2. (SELECT count(parent.id)-1
  3. FROM multikategorie AS parent
  4. WHERE node.LEFT BETWEEN parent.LEFT AND parent.RIGHT)
  5. AS depth
  6. FROM multikategorie AS node
  7. ORDER BY node.LEFT


Jednak to mi zrzuca całą listę multikategorii (a chciałbym poruszać się tylko poniżej wybranego parentu).

Wykombinowałem takie coś:
  1. SELECT title, id,
  2. (SELECT count(parent.id)-1
  3. FROM multikategorie AS parent
  4. WHERE node.LEFT BETWEEN parent.LEFT AND parent.RIGHT)
  5. AS depth
  6. FROM multikategorie AS node WHERE node.parent_id = '376769'
  7. ORDER BY node.LEFT


I owszem działa - tylko wyświetla mi kategorie poniżej wybranego parentu - nie wchodzi już np. 2,3,4 czy 5 poziomów poniżej...

Wiesz może jak to zmienić?
phpion
Nie kombinuj tylko zapoznaj się z tym, co Ci podał kolega. Zapewniam Cię, że po lekturze całości znajdziesz odpowiedź na swoje pytanie.
trifek
tzn znalazłem takie zapytanie ( http://www.wykop.pl/ramka/371768/konstrukc...ypu-nested-set/ ):

  1.  
  2. SELECT
  3. concat( repeat('-', COUNT(parent.id) - 1),child.title)
  4. AS title,
  5. child.id
  6. FROM multikategorie AS child,
  7. multikategorie AS parent
  8. WHERE child.LEFT BETWEEN parent.LEFT AND parent.RIGHT
  9. AND child.LEFT BETWEEN 376769 AND .........
  10. GROUP BY child.id
  11. ORDER BY child.LEFT
  12.  


Z opisu wynika iż to: 376769 jest "górna" kategoria od której zaczynamy szukać....
A jak nie wiem jaka jest ostatnia, to co wpisać po and (w miejsce kropek)?
Pyton_000
Możesz powiedzieć ładnie co chcesz zrobić ?
trifek
OK, już tłumaczę smile.gif

mam takie drzewko:
- Samochody
-- Osobowe
--- Skoda
----- Rapid
------- Części
-------- Elektronika
---------- Komputery
----- Octavia
----- SuperB
----- Fabia
--- Opel
--- Peugeot
--- Mazda

(lista kategorii). Po wybraniu jakiejś kategorii chcę wyświetlić należące do niej produkty. Czyli tak jak sugerowaliście, na początku muszę mieć id wszystkich kategorii - od tej w której jestem "w dół".

W momencie gdy kliknę w "samochody" to chcę otrzymać id kategorii:
- Samochody
-- Osobowe
--- Skoda
----- Rapid
------- Części
-------- Elektronika
---------- Komputery
----- Octavia
----- SuperB
----- Fabia
--- Opel
--- Peugeot
--- Mazda

W momencie gdy Kliknę w "Osobowe":
-- Osobowe
--- Skoda
----- Rapid
------- Części
-------- Elektronika
---------- Komputery
----- Octavia
----- SuperB
----- Fabia
--- Opel
--- Peugeot
--- Mazda

W momencie gdy Kliknę "Skoda":
--- Skoda
----- Rapid
------- Części
-------- Elektronika
---------- Komputery
----- Octavia
----- SuperB
----- Fabia

Lub gdy kliknę w "Rapid":
----- Rapid
------- Części
-------- Elektronika
---------- Komputery



Chcę wyświetlać produkty które są w wybranej kategorii smile.gif
Pyton_000
SELECT id FROM multikategorie WHERE left >= left_z_kat_kliknietej AND right <= right_z_kat_klieknietej;

jak zmienisz na <= i >= to dstaniesz razem z obecną.
trifek
takie zapytanie:
SELECT title, id FROM multikategorie WHERE multikategorie.left <= 376769 AND multikategorie.right >= 376769;


nie zwraca prawdziwych wyników sad.gif
Pokazują się kategorie nie związane z parentem
Pyton_000
tfuu... odwrotnie left >= i right <= smile.gif
trifek
SELECT title, id
FROM multikategorie
WHERE multikategorie.left >= 376769
AND multikategorie.right <=376769

teraz nic nie zwraca.... a powinien sad.gif
Pyton_000
Masz zrobić np. tak:

  1. SELECT id FROM cms_multikategorie WHERE `left` >= 79433 AND `right` <= 101816


Czyli 79433 - to jest wartość left kategorii której klikasz
a 101816 wartość right
trifek
a skąd masz tą wartość: 101816 questionmark.gifsmile.gif
Pyton_000
To są Wartości left i right dla ID które klikasz
trifek
Przepraszam, ale się zagubiłem sad.gif

Jestem na górze drzewka kategorii - klikam 1 kategorię np. o ID 325193 - i wtedy co dalej?
Mam tylko 1 wartość....
Pyton_000
Chłopie czytaj to co piszę.

to są wartości LEFT i RIGHT z BAZY dla ID == np. 325193
trifek
dziękuję, teraz zrozumiałem smile.gif działa super!! smile.gif
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.