Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Filtry dynamiczne
Adam93
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


Cześć,

Chciałbym prosić o pomoc (IMG:style_emoticons/default/smile.gif)

Może przedstawię problem na przykładzie:

Mam pewien sklep internetowy, muszę w nim zrobić dynamiczne filtry tzn:
1. Każda kategoria posiada dynamiczne filtry. W kategorii możemy dodać np. filtr Producent oraz atrybuty filtru: Producent 1, Producent 2, Producent 3. Filtrów może być nieograniczona liczba
2. Każdy produkt przypisany do tej kategorii będzie musiał mieć uzupełniony filtr Producent, można wybrać tylko jeden atrybut filtra Producent w każdym produkcie.

Mój problem polega na tym, że gdy na stronie w widoku danej kategorii zaznaczę jeden filtr np, Producent 1 wyświetli mi produkty tylko te, które mają tego Producenta.
Gdy zaznaczę parę filtrów, np. Producent 1 i Waga 1 nie wyświetla mi żadnego produktu.

Moje zapytanie do bazy wygląda następująco:

CODE
SELECT produkty.* FROM produkty LEFT JOIN kategorie_produkty ON produkty.id = kategorie_produkty.produkty_id LEFT JOIN kategorie_filtry ON produkty.id = kategorie_filtry.produkt_id LEFT JOIN filtry_dynamic ON kategorie_filtry.filtr_id = filtry_dynamic.id WHERE (filtry_dynamic.id = 94 AND filtry_dynamic.id = 95) AND (kategorie_produkty.kategorie_id = 34)


, gdzie filtry_dynamic.id jest to id zaznaczonych filtrów.

Dziękuję za pomoc (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
filtry_dynamic.id = 94 AND filtry_dynamic.id = 95
Podstawy logiki sie klaniaja. Naprawde sadzisz ze filtr moze miec jedonoczesnie id 94 i 95? No raczej nie. Jak juz cos to
filtry_dynamic.id = 94 OR filtry_dynamic.id = 95
Go to the top of the page
+Quote Post
Adam93
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


Z OR działa, lecz nie do końca tak jak powinno, mamy na przykład:

Produkt 1, który ma ustawiony następujące atrybuty filtrów Producent i Waga (Producent 1, Waga 1)
Produkt 2 (Producent 2, Waga 1)

Po zaznaczeniu Producent 2 i Waga 1 chcę by wyświetliło mi tylko Produkt 2,
po zaznaczeniu Waga 1 powinno wyświetlić oba produkty,
po zaznaczeniu Producent 1 wyświetla tylko Produkt 1,
po zaznaczeniu Producent 2 wyświetla tylko Produkt 2.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




w takim wypadku musisz stworzyc tyle JOINow na filtry dynamic ile filtrow bedziesz sprawdzal
Go to the top of the page
+Quote Post
Adam93
post
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


A czy mógłbym Cię poprosić o przykład na powyższym zapytaniu sql?
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




...
LEFT JOIN filtry_dynamic fd1 ON (kategorie_filtry.filtr_id = fd1.id AND fd1.id = 94)
LEFT JOIN filtry_dynamic fd2 ON (kategorie_filtry.filtr_id = fd2.id AND fd2.id = 95)
WHERE .... fd1.filtr_id is not null and fd2.filtr_id is not null
Go to the top of the page
+Quote Post
Adam93
post
Post #7





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


Moje zapytanie do bazy wygląda następująco:

CODE
SELECT produkty.* FROM produkty LEFT JOIN kategorie_produkty ON produkty.id = kategorie_produkty.produkty_id LEFT JOIN kategorie_filtry ON produkty.id = kategorie_filtry.produkt_id LEFT JOIN filtry_dynamic fd0 ON (kategorie_filtry.filtr_id = fd0.id AND fd0.id = 91) LEFT JOIN filtry_dynamic fd1 ON (kategorie_filtry.filtr_id = fd1.id AND fd1.id = 92) WHERE (fd0.id IS NOT NULL AND fd1.id IS NOT NULL) AND (kategorie_produkty.kategorie_id = 34)


Dla wybrania jednego filtru, produkty są filtrowane. Kiedy wybiorę więcej filtrów nie wyświetla żadnego produktu. Co może być źle w tym zapytaniu? Jest to zapytanie, kiedy wybrałem więcej niż jeden filtr.
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Wywal z WHERE kawalki z fd0 i fd1 i pokaz co to zwraca
Go to the top of the page
+Quote Post
Adam93
post
Post #9





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


Usunąłem warunki z fd z WHERE, teraz przy próbie filtrowania produktów filtry nie działają. Wyświetla wszystkie produkty.
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Prosilem abys polazal mi wynik czyli zebys pokazal rekordy jakie zwraca.
Do select dodaj tez pola z obu filtry_dynamic
Go to the top of the page
+Quote Post
Adam93
post
Post #11





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


Tak wygląda SELECT:

CODE
SELECT DISTINCT produkty.symbol, produkty.* FROM produkty LEFT JOIN kategorie_produkty ON produkty.id = kategorie_produkty.produkty_id LEFT JOIN kategorie_filtry ON produkty.id = kategorie_filtry.produkt_id LEFT JOIN filtry_dynamic fd0 ON (kategorie_filtry.filtr_id = fd0.id AND fd0.id = 91) LEFT JOIN filtry_dynamic fd1 ON (kategorie_filtry.filtr_id = fd1.id AND fd1.id = 92) WHERE kategorie_produkty.kategorie_id = 34


i zwraca mi poniższego JSONA:
CODE
[
{
"symbol":"122d4aa",
"id":6,
"kod":"123",
"nazwa":"Plecak ",
"link":"plecak",
"cena_netto":0,
"cena":237.5,
"stara_cena_sprzedazy":250,
"rabat":5,
"podatek":23,
"opis":"lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor",
"czas":2,
"dostepnosc":2,
"bestseller":0,
"temp":0,
"sort":10,
"newsort":0,
"waga":2,
"cena_wysylki_opcja":15,
"rozmiar_dlugosc":65,
"rozmiar_wysokosc":65,
"rozmiar_szerokosc":27,
"kolor_id":1,
"material_id":2,
"stan":0,
"nowosc":1,
"promocja":1,
"nokaut_kategoria":0
},
{
"symbol":"123",
"id":15,
"kod":"321",
"nazwa":"Plecak 2",
"link":"plecak-2",
"cena_netto":0,
"cena":75,
"stara_cena_sprzedazy":0,
"rabat":0,
"podatek":23,
"opis":"lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolorlorem ipsum dolorlorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolorlorem ipsum dolor lorem ipsum dolor",
"czas":5,
"dostepnosc":2,
"bestseller":0,
"temp":0,
"sort":10,
"newsort":0,
"waga":2,
"cena_wysylki_opcja":10,
"rozmiar_dlugosc":40,
"rozmiar_wysokosc":75,
"rozmiar_szerokosc":60,
"kolor_id":1,
"material_id":1,
"stan":0,
"nowosc":1,
"promocja":0,
"nokaut_kategoria":0
}
]


Pierwszy produkt posiada atrybut Waga 1, a drugi produkt posiada atrybut Waga 2
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Prosilem bys do wyniku dolaczyl dane z innych tabel ktore JOINujesz. Dodatkowo wywal DISTINCT gdyz chce zobaczyc wszystkie dane jakie sa zwracane. Staraj sie prosze czytac dokladniej o co prosza osoby,ktore chca ci pomoc.
Go to the top of the page
+Quote Post
Adam93
post
Post #13





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


W jsonie jest wynik połączonych tabel, które zwróciło zapytanie:

CODE
[
{
"id":"92",
"symbol":"122d4aa",
"kod":"123",
"nazwa":"",
"link":"plecak",
"cena_netto":"0.00",
"cena":"237.50",
"stara_cena_sprzedazy":"250.00",
"rabat":"5.00",
"podatek":"23",
"opis":"lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor",
"czas":"2",
"dostepnosc":"2",
"bestseller":"0",
"temp":"0",
"sort":"10",
"newsort":"0",
"waga":"2.00",
"cena_wysylki_opcja":"15.00",
"rozmiar_dlugosc":"65.00",
"rozmiar_wysokosc":"65.00",
"rozmiar_szerokosc":"27.00",
"kolor_id":"1",
"material_id":"2",
"stan":"0",
"nowosc":"1",
"promocja":"1",
"nokaut_kategoria":"0",
"filtr_id":"92",
"produkt_id":"6",
"parent_id":"90",
"kat_id":"34",
"atrybut":"Waga 2"
},
{
"id":null,
"symbol":"122d4aa",
"kod":"123",
"nazwa":null,
"link":"plecak",
"cena_netto":"0.00",
"cena":"237.50",
"stara_cena_sprzedazy":"250.00",
"rabat":"5.00",
"podatek":"23",
"opis":"lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor",
"czas":"2",
"dostepnosc":"2",
"bestseller":"0",
"temp":"0",
"sort":"10",
"newsort":"0",
"waga":"2.00",
"cena_wysylki_opcja":"15.00",
"rozmiar_dlugosc":"65.00",
"rozmiar_wysokosc":"65.00",
"rozmiar_szerokosc":"27.00",
"kolor_id":"1",
"material_id":"2",
"stan":"0",
"nowosc":"1",
"promocja":"1",
"nokaut_kategoria":"0",
"filtr_id":"102",
"produkt_id":"6",
"parent_id":null,
"kat_id":null,
"atrybut":null
},
{
"id":null,
"symbol":"123",
"kod":"321",
"nazwa":null,
"link":"plecak-2",
"cena_netto":"0.00",
"cena":"75.00",
"stara_cena_sprzedazy":"0.00",
"rabat":"0.00",
"podatek":"23",
"opis":"lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolorlorem ipsum dolorlorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolorlorem ipsum dolor lorem ipsum dolor",
"czas":"5",
"dostepnosc":"2",
"bestseller":"0",
"temp":"0",
"sort":"10",
"newsort":"0",
"waga":"2.00",
"cena_wysylki_opcja":"10.00",
"rozmiar_dlugosc":"40.00",
"rozmiar_wysokosc":"75.00",
"rozmiar_szerokosc":"60.00",
"kolor_id":"1",
"material_id":"1",
"stan":"0",
"nowosc":"1",
"promocja":"0",
"nokaut_kategoria":"0",
"filtr_id":"91",
"produkt_id":"15",
"parent_id":null,
"kat_id":null,
"atrybut":null
},
{
"id":null,
"symbol":"123",
"kod":"321",
"nazwa":null,
"link":"plecak-2",
"cena_netto":"0.00",
"cena":"75.00",
"stara_cena_sprzedazy":"0.00",
"rabat":"0.00",
"podatek":"23",
"opis":"lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolorlorem ipsum dolorlorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolorlorem ipsum dolor lorem ipsum dolor",
"czas":"5",
"dostepnosc":"2",
"bestseller":"0",
"temp":"0",
"sort":"10",
"newsort":"0",
"waga":"2.00",
"cena_wysylki_opcja":"10.00",
"rozmiar_dlugosc":"40.00",
"rozmiar_wysokosc":"75.00",
"rozmiar_szerokosc":"60.00",
"kolor_id":"1",
"material_id":"1",
"stan":"0",
"nowosc":"1",
"promocja":"0",
"nokaut_kategoria":"0",
"filtr_id":"102",
"produkt_id":"15",
"parent_id":null,
"kat_id":null,
"atrybut":null
}
]



Zapytanie:

CODE
SELECT produkty.*, kategorie_filtry.* ,fd0.*, fd1.* FROM produkty
LEFT JOIN kategorie_produkty
ON produkty.id = kategorie_produkty.produkty_id
LEFT JOIN kategorie_filtry
ON produkty.id = kategorie_filtry.produkt_id LEFT
JOIN filtry_dynamic fd0
ON (kategorie_filtry.filtr_id = fd0.id AND fd0.id = 91)
LEFT JOIN filtry_dynamic fd1
ON (kategorie_filtry.filtr_id = fd1.id AND fd1.id = 92)
WHERE (kategorie_produkty.kategorie_id = 34)
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cos mi sie widzie ze te podwojne JOINowanie musisz przeniesc na kategorie_filtry zamiast na dynamic_filtry. Masz zakrecona strukture (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Adam93
post
Post #15





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.04.2017

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


A mógłbym Cię prosić o napisanie jak to powinno wyglądać na przykładzie powyższego zapytania? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A moglbym cie prosic bys w koncu sprobowal zrobic cos sam majac jako przyklad powyzszy przyklad? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 01:32