w serwisie erobay.pl zastosowałem taki oto format:
Kategorie produktów, a do każdej (zaczynając od rodzica - potomkowie dziedziczą parametry) dodałem parametry.
Każdy z nich zadeklarowałem w/g takich wartości jak: checkbox, select i range.
Każde z nich ma na celu dać użytkownikowi pożądany sposób przefiltrowania informacji oraz przy wysłaniu formularza przygotowanie odpowiedniego zapytania do bazy danych.
I tak w przypadku jeśli parametrem jest checkbox wtedy każdy kolejny parametr z tej grupy rozdzielany jest jako OR (tak by dopasować maksymalnie dużo pasujących wyników).
Gdy wybierze ktoś select to wtedy tylko i wyłącznie wybrana wartość jest brana pod uwagę...
Range - czyli zakres, wtedy system wypisze pole w stylu Cena od: [____] do: [____] - i analogicznie dobierze zapytanie które określi zakres

Tyle w teorii..
W praktyce wygląda to tak:
CREATE TABLE IF NOT EXISTS `parametr` (
`PRM_Id` int(11) NOT NULL AUTO_INCREMENT,
`CAT_Id` int(11) NOT NULL,
`PRM_Name` varchar(45) NOT NULL,
`PRM_FormName` varchar(45) NOT NULL,
`PRM_Type` enum('select','checkbox','range') NOT NULL,
`PRM_MultiSelect` int(1) NOT NULL DEFAULT '0',
`PRM_Value` text NOT NULL,
`PRM_Sort` int(11) NOT NULL DEFAULT '0',
`PRM_Active` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`PRM_Id`),
KEY `PARAMERTS` (`CAT_Id`,`PRM_Active`),
KEY `PRM_FormName` (`PRM_FormName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Opis pól:
PRM_Id - id rekordu w tej tabeli
CAT_Id - id kategorii od której zaczyna się ten parametr (wszystkie kategorie dzieci będą dziedziczyć ten parametr)
PRM_Name - nazwa pola widzialna dla użytkownika: np. Kolor
PRM_FormName - nazwa pola w formularzu
PRM_Type - czyli to ten wybór z wspomnianych informacji powyżej...
PRM_MultiSelect - to nie jest potrzebne do tego zagadnienia (czyli można wywalić)
PRM_Value - tak samo (można pominąć)
PRM_Sort - kierunek sortowania (wartość liczbowa)
PRM_Active - wartość 1 jesli parametr aktywny i widoczny, 0 jeśli nieaktywny i niewidoczny
2 tabelą są wartości tych parametrów:
CREATE TABLE IF NOT EXISTS `parametrvalue` (
`PRV_Id` int(11) NOT NULL AUTO_INCREMENT,
`PRM_Id` int(11) NOT NULL,
`PRV_Value` varchar(255) NOT NULL,
`PRV_Sort` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`PRV_Id`),
KEY `parametr` (`PRM_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
PRV_Id - id rekordu w tej tabeli
PRM_Id - id parametru (z poprzedniej tabeli)
PRV_Value - wartość widoczna dla użytkownika, np. Parametr Kolor, wartości: różowy, zielony, niebieski...
PRV_Sort - ustawienie kolejności sortowania (wartość liczbowa)
i ostatnia tabela z parametrami przypisanymi do samych produktów:
CREATE TABLE IF NOT EXISTS `productsparametr` (
`PRP_Id` int(11) NOT NULL AUTO_INCREMENT,
`PRD_Id` int(11) NOT NULL,
`PRV_Id` int(11) NOT NULL,
`PRP_Value` varchar(45) NOT NULL,
PRIMARY KEY (`PRP_Id`),
KEY `PRODUCT` (`PRD_Id`),
KEY `VALUE` (`PRV_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Opis pól:
PRP_Id - id rekordu
PRD_Id - id produktu
PRV_Id - id wartości (po tym dojdziecie jaki to parametr)
PRP_Value - wartość dla pola range (zakres)
To by było tyle jeśli chodzi o mój układ.
Napisanie samego zapytania chyba nie powinno stanowić problemu, w razie czego go tu wkleje...
Pozdo 600 i niech moc będzie z wami