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:
SELECT `p`.`PRD_Name` AS `name` FROM `products` AS `p` LEFT JOIN `productsparametr` AS `pp` ON (`pp`.`PRD_Id` = `p`.`PRD_Id`) LEFT JOIN `productsparametr` AS `pp2` ON (`pp2`.`PRD_Id` = `p`.`PRD_Id`) LEFT JOIN `productsparametr` AS `pp3` ON (`pp3`.`PRD_Id` = `p`.`PRD_Id`) WHERE (`pp`.`PRV_Id` = 15) #Kolor: zielony AND (`pp2`.`PRV_Id` = 29) #Rodzaj paliwa: LPG AND (`pp3`.`PRV_Id` = 2) #Lakier: metalic
A oto zapytanie co działa szybko ale pokazuje za wiele:
SELECT `p`.`PRD_Name` AS `name` FROM `products` AS `p` LEFT JOIN `productsparametr` AS `pp` ON (`pp`.`PRD_Id` = `p`.`PRD_Id`) WHERE (`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ł
