Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Filtrowanie produktów po parametrach kategorii
sniver
post
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

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


Ponownie wracam z problemem. Tym razem nieco innym niż dotychczas..
Mianowicie chodzi mi o to że mam bazę produktów. Produkty oczywiście są skategoryzowane (wg. parent_id i drzewek ip - pomysł wzięty stąd). Do kategorii są przypisane parametry które mogą być wykorzystane przy dodawaniu produktu - podobnie jak na allegro...

Przy przeglądaniu listy produktów z jakiejś kategorii jest widoczny boks w którym można określić interesujące kogoś parametry - np. rodzaj paliwa (diesel, benzyna, lpg itp.).

No i teraz problem. Gdy ktoś wybierze tylko jeden parametr to sprawa jest załatwiona, ale jeśli ktoś wybierze 2 lub więcej, czyli np. rodzaj paliwa: lpg, lakier: metalic, kolor: zielony

Wtedy jest oczywiste że nie powinien brać każdego rekordu w którym któryś z tych parametrów występił, a jedynie te do których wszystkie parametry razem wzięte pasują.

czyli przykładowo baza zawiera:
1. Mercedes E320 - kolor: czarny, lakier: metalic, rodzaj paliwa: benzyna
2. Ford Mondeo - kolor: zielony, lakier: metalic, rodzaj paliwa: lpg
3. Opel Vectra - kolor: zielony, lakier: metalic, rodzaj paliwa: lpg

Wynik powinien pokazać 2 i 3 rekord, a nie wszystkie...

Próbowałem połączyć to zapytaniem z IN w warunku ale pokazuje wszystkie 3, z kolei jeśli chciałem wydzielić tylko i wyłącznie 2 rekordy odwołując się i dodając tabele z różnymi aliasami zapytanie zamula przy większej ilości danych...

Zapytanie co działa dobrze, ale wolno i jest nieeleganckie:
  1. SELECT
  2. `p`.`PRD_Name` AS `name`
  3.  
  4. FROM
  5. `products` AS `p`
  6. LEFT JOIN `productsparametr` AS `pp` ON (`pp`.`PRD_Id` = `p`.`PRD_Id`)
  7. LEFT JOIN `productsparametr` AS `pp2` ON (`pp2`.`PRD_Id` = `p`.`PRD_Id`)
  8. LEFT JOIN `productsparametr` AS `pp3` ON (`pp3`.`PRD_Id` = `p`.`PRD_Id`)
  9.  
  10. WHERE
  11. (`pp`.`PRV_Id` = 15) #Kolor: zielony
  12. AND (`pp2`.`PRV_Id` = 29) #Rodzaj paliwa: LPG
  13. AND (`pp3`.`PRV_Id` = 2) #Lakier: metalic



A oto zapytanie co działa szybko ale pokazuje za wiele:
  1. SELECT
  2. `p`.`PRD_Name` AS `name`
  3.  
  4. FROM
  5. `products` AS `p`
  6. LEFT JOIN `productsparametr` AS `pp` ON (`pp`.`PRD_Id` = `p`.`PRD_Id`)
  7.  
  8. WHERE
  9. (`pp`.`PRV_Id` IN (15, 29, 2))



Kilka słów o bazie:

products - tabela z produktami
PRD_Name - to nazwa produktu
PRD_Id - to id produktu

productsparametr - tabela z parametrami o produktach
PRV_Id - Id atrybutu (może sie potarzać w bazie)
PRD_Id - Id produktu do którego odwołuje sie ten parametr


Czy wie ktoś jak rozwiązać ten problem łatwo i bez nadmiernego chaosu?

Chyba się nie da tego inaczej zrobić niż na połączonych tabelach - będe obserwować ten temat - może ktoś wpadnie na ciekawy pomysł (IMG:style_emoticons/default/smile.gif)

Ten post edytował sniver 8.05.2010, 13:51:12
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 14:45