Nehéz a lekérdezés, ha a szűrési feltételek több sorban vannak
Sziasztok!
Lenne egy kis problémám. Webáruház. Termékszűrés. Az adatbázistábla így néz ki:
CIKKSZÁM | PARAMÉTERNÉV | PARAMÉTER ÉRTÉK
CIKKSZÁM | MÁSIK PARAMÉTERNÉV | MÁSIK PARAMÉTER ÉRTÉK
Például:
A1 | hossz | 110
A1 | súly | 50
A2 | hossz | 130
A2 | súly | 50
Egy űrlap segítségével ki lehet választani, hogy milyen paraméterek kerüljenek be a feltételekbe... a feltételek között mindig ÉS kapcsolat van. Pl...
hossz 110 és súly 50. Hogy lehetne olyan lekérdezést írni, ami visszadja, hogy A1? A baj az, hogy a WHERE résznél nem adható meg, hogy paraméternév=hossz AND paraméterérték=110, hiszen ezután kellene egy AND paraméternév=súly AND paraméterérték=50 is, ami viszont már nem erre, hanem egy másik sorra fog vonatkozni.
Hogy lehetne ezt megoldani? Gondolkodtam rajta, hogy mindegyik feltételt lekérdezem, GROUP By-al összeszámolom az azonos cikkszámokat és ha a számuk pont annyi, mint ahány keresési feltétel van, akkor azok a megfelelő termékek, ez viszont gányolás. Van valakinek jobb ötlete?
Nagyon szépen köszönöm!
■ Lenne egy kis problémám. Webáruház. Termékszűrés. Az adatbázistábla így néz ki:
CIKKSZÁM | PARAMÉTERNÉV | PARAMÉTER ÉRTÉK
CIKKSZÁM | MÁSIK PARAMÉTERNÉV | MÁSIK PARAMÉTER ÉRTÉK
Például:
A1 | hossz | 110
A1 | súly | 50
A2 | hossz | 130
A2 | súly | 50
Egy űrlap segítségével ki lehet választani, hogy milyen paraméterek kerüljenek be a feltételekbe... a feltételek között mindig ÉS kapcsolat van. Pl...
hossz 110 és súly 50. Hogy lehetne olyan lekérdezést írni, ami visszadja, hogy A1? A baj az, hogy a WHERE résznél nem adható meg, hogy paraméternév=hossz AND paraméterérték=110, hiszen ezután kellene egy AND paraméternév=súly AND paraméterérték=50 is, ami viszont már nem erre, hanem egy másik sorra fog vonatkozni.
Hogy lehetne ezt megoldani? Gondolkodtam rajta, hogy mindegyik feltételt lekérdezem, GROUP By-al összeszámolom az azonos cikkszámokat és ha a számuk pont annyi, mint ahány keresési feltétel van, akkor azok a megfelelő termékek, ez viszont gányolás. Van valakinek jobb ötlete?
Nagyon szépen köszönöm!
itt egy ötlet
Nem egyszer csináltam már ilyen szűrést :) A legjobb, ha joint használsz - szerintem.
SELECT termek.*
FROM termek
INNER JOIN parameterek p1 ON termek.cikkmzam=p1.cikkszam AND parameter_nev='hossz' AND parameter_ertek='110'
INNER JOIN parameterek p2 ON termek.cikkmzam=p2.cikkszam AND parameter_nev='suly' AND parameter_ertek='50'
...
Ennyi az egész. Nagyon egyszerűen előállthatod az egész JOIN szerkezetet egy ciklussal PHP-ben.
Javaslom, hogy a paraméterek táblájában minden értékből képezz egy hash-t (pl crc32 vagy kisebb), amit egy integer mezőben tárolsz az értékhez. Így az összehasonlÍtásnál kevesebb erőforrást használsz. A hash képzésénél "normalizáld" az adott értéket, úgy értem eressz rá egy trimet meg egy str2lower-t, továbbá a számokat hozd egységes formátumra (tizedes vesszőket tizedes pontra cerélni vagy fordÍtva). Ekkor a joinban az utolsó feltétel ilyesmi: "hash=2315415"
Így a programod meg fogja találni a "3,1 ", a "3.1" és a " 3.1" értékeket is.
A diszkrét értékeket egy-egy tulajdonsághoz Így tudod kiválasztani:
SELECT parameter_ertek FROM parameterek WHERE parameter_nev='suly' GROUP BY hash
Remélem tudtam segteni!
Köszönet
Örülök...