Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyszukiwanie w MySQL i wyświetlanie produktów na podstawie "drzewa" kategorii
trifek
post
Post #1





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


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?

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 16)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


http://www.wykop.pl/ramka/371768/konstrukc...ypu-nested-set/
Go to the top of the page
+Quote Post
trifek
post
Post #3





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Nie kombinuj tylko zapoznaj się z tym, co Ci podał kolega. Zapewniam Cię, że po lekturze całości znajdziesz odpowiedź na swoje pytanie.
Go to the top of the page
+Quote Post
trifek
post
Post #5





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


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)?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Możesz powiedzieć ładnie co chcesz zrobić ?
Go to the top of the page
+Quote Post
trifek
post
Post #7





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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ą.

Ten post edytował Pyton_000 15.10.2015, 12:55:37
Go to the top of the page
+Quote Post
trifek
post
Post #9





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


tfuu... odwrotnie left >= i right <= smile.gif

Ten post edytował Pyton_000 15.10.2015, 12:55:24
Go to the top of the page
+Quote Post
trifek
post
Post #11





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


SELECT title, id
FROM multikategorie
WHERE multikategorie.left >= 376769
AND multikategorie.right <=376769

teraz nic nie zwraca.... a powinien sad.gif
Go to the top of the page
+Quote Post
Pyton_000
post
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trifek
post
Post #13





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


a skąd masz tą wartość: 101816 questionmark.gifsmile.gif
Go to the top of the page
+Quote Post
Pyton_000
post
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


To są Wartości left i right dla ID które klikasz
Go to the top of the page
+Quote Post
trifek
post
Post #15





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


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ść....
Go to the top of the page
+Quote Post
Pyton_000
post
Post #16





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Chłopie czytaj to co piszę.

to są wartości LEFT i RIGHT z BAZY dla ID == np. 325193
Go to the top of the page
+Quote Post
trifek
post
Post #17





Grupa: Zarejestrowani
Postów: 340
Pomógł: 0
Dołączył: 28.09.2015

Ostrzeżenie: (0%)
-----


dziękuję, teraz zrozumiałem smile.gif działa super!! smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 02:43