![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witam,
chciałbym w sklepie internetowym wprowadzić nawigację po cechach, która jest obecnie stosowana w wielu sklepach np. cyfrowe.pl rtveuroagd itp. W skrócie chodzi mi o coś takiego, że klient po wejściu w kategorię produktów typu telewizory może za pomocą filtrów wyszukać te np. o przekątnej 15" i cenie od 2 do 3000 itd. Macie wiedzę/pomysł jak to zrobić optymalnie? Na wstępie myślałem o takiej tabeli: (FK)id_produktu | (FK)id_cechy | wartość cechy Problem jaki napotykam, to jak wyciągnąć z tej tabeli produkty spełniające np. 3 warunki (dla każdego produktu będzie tyle rekordów ile jest przypisanych do niego cech - w sumie nawet więcej bo niektóre cechy są wielokrotnego wyboru). Czy np. jeśli klient sobie zażyczy telewizor zdefiniowany cechami 32", czarny, Sony, do 5000zł to należy wykonać odpowiednio 4 zapytania - najpierw poszukać wszystkie telewizory 32" z nich wszystkie czarne, z nich te marki Sony itd? Czy może taki problem da się rozwiązać jakoś w miarę elegancko? Niby problem banalny, ale mam jakieś zaćmienie i nie mogę wymyślić jak to rozwiązać lepiej niż to co opisałem wyżej. Pozdrawiam i dzięki za pomoc. |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
na wyszukiwanie wystarczy jedno zapytanie. Poprostu robisz tyle LEFT JOIN cech po ilu szukasz cech. I dla każdego left join ma być warunek w WHERE:
WHERE c1.id_produktu is not null and c2.id_produktu is not null and..... |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Hum, LEFT JOIN'y ?
Wydaje mi się że to po prostu jest zwykłe zapytanie z INNER JOIN (produkty na cechy) warunek na cechy na które mamy nałożone warunki i zwykłe AND'y na ich wartości i do tego group by po produktach, pytanie też co z produktami które nie posiadają danych cech (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
OOO to wydaje mi się ciekawym rozwiązaniem - muszę to przetestować, bo na potrzeby pytania uprościłem trochę problem (produkty jeszcze łączą się w grupy itd), ale wydaj mi się, że to powinno zadziałać.
Wielkie dzięki. //edit melkorm - akurat produktów bez danej cechy nie będzie, bo wewnątrz kategorii będzie cecha wymagana i nawet jeśli jej nie ma ustawionej, to powstanie rekord null - tak na prawdę ta tabela to będzie cache całego systemu cech, bo będzie też wiele cech niefiltrowalnych itp. Tutaj powstanie taka tabela zawierająca cache tych cech, które można filtrować. Na szybko jak sobie to układam, to nospor ma chyba rację poniżej, ale coś wolno kojarzę dzisiaj, więc sobie to na spokojnie w wolnej chwili przetestuję. Ten post edytował athabus 29.10.2012, 15:53:32 |
|
|
![]()
Post
#5
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@melkorm tak, left joiny. Tyle ile szukasz cech, tyle musisz dać leftjoinów. Nie możesz dać ANDów od tak sobie jak piszesz bo nie zakumałeś problemu (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
@nospor, możliwe, jestem lekko wczorajszy i nigdy nie robiłem takiej funkcjonalności, więc możliwe że czegoś nie skumałem, z chęcią zobaczę jakiś przykład to bym ewentualnie poprawił swój tok myślenia (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Na szybko jak sobie to układam, to nospor ma chyba rację poniżej, ale coś wolno kojarzę dzisiaj, więc sobie to na spokojnie w wolnej chwili przetestuję. @Athabus rozwiązanie, które ci podałem stosowałem wielokrotnie i zawsze działało (IMG:style_emoticons/default/wink.gif) A stosowałem je dokładnie w tym samym celu co ty i z dokładnie takim samym rozwiązaniem cech dla produktów.@melkorm nie można tu użyć tylko jednego JOINA na cechy, gdyż każda cecha to oddzielny rekord w tabeli. Nie możesz więc zrobić jedngo JOIN a potem zwykły AND na każdą cechę, gdyż taki warunek nigdy nie będzie spełniony. Jeden rekord nie może być jednoczenie =4 i =8 i =2 (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Super, czyli sposób sprawdzony ;-)
Jeszcze raz wielkie dzięki za pomoc, bo bałem się, że utknę na tym pod względem wydajności. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
@melkorm tak, left joiny. Tyle ile szukasz cech, tyle musisz dać leftjoinów. Nie możesz dać ANDów od tak sobie jak piszesz bo nie zakumałeś problemu (IMG:style_emoticons/default/wink.gif) jeśli dobrze zrozumiałem to chcesz zrobić coś takiego
dobrze zrozumiałem (IMG:style_emoticons/default/questionmark.gif) jeśli tak to ja bym to zrobił inaczej
działa sprawdzone (IMG:style_emoticons/default/wink.gif) i tylko jeden left join |
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat działa sprawdzone Nie wiem po ilu głębszych to sprawdzałeś, ale o to:WHERE (c.cechaId= 1 AND c.cechaWartość=1) AND (c.cechaId= 2 AND c.cechaWartość=10) nie ma racji bytu. Id danej cechy nie może jednocześnie wynosic 1 i 2 (IMG:style_emoticons/default/smile.gif) Tłumaczyłem już to melkormowi Cytat Jeden rekord nie może być jednoczenie =4 i =8 i =2 Staraj się czytać wszystko - temat naprawdę jest krótki a wyjaśnienia pisane po polsku (IMG:style_emoticons/default/wink.gif) A i nie pisz, że coś jest sprawdzone, skoro tego nie sprawdzałeś. Nieładnie tak kłamać (IMG:style_emoticons/default/wink.gif) Jeśli zaś miałeś na myśli taki warunek: WHERE (c.cechaId= 1 AND c.cechaWartość=1) OR (c.cechaId= 2 AND c.cechaWartość=10) to nijak sie on będzie miał do przedstawionego tu problemu (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 045 Pomógł: 141 Dołączył: 19.09.2006 Skąd: B-tów Ostrzeżenie: (0%) ![]() ![]() |
@nospor
ty podły człowieku przez Ciebie aż sprawdziłem jak to nie działa jak działa i okazało się że był błąd w kodzie po stronie php przez co całość "udawała że działa". I teraz pół kodu musiałem przerabiać Ciebie przerabiać, no dziękuję bardzo (IMG:style_emoticons/default/biggrin.gif) Ja zdecydowałem się na podzapytania w WHERE, a nie na LEFT JOJN'ach ponieważ mój system wygląda nieco inaczej ale efekt jest ten sam (IMG:style_emoticons/default/wink.gif) a tak już na zakończenie to przypadkiem danie warunku "cechaWartość=X" w ON nie będzie szybsze niż w WHERE ? |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat a tak już na zakończenie to przypadkiem danie warunku "cechaWartość=X" w ON nie będzie szybsze niż w WHERE ? No przecież ja daję właśnie w ON. W where to ja już jedynie sprawdzam czy ID nie jest NULLem (IMG:style_emoticons/default/smile.gif) Cytat i okazało się że był błąd w kodzie po stronie php przez co całość "udawała że działa". W takim razie przepraszam za to "kłamanie" (IMG:style_emoticons/default/smile.gif) Cytat I teraz pół kodu musiałem przerabiać Ciebie przerabiać, no dziękuję bardzo Garnczek miodku i będziemy kwita (IMG:style_emoticons/default/smile.gif)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 18.09.2025 - 07:24 |