ugrás a tartalomhoz

Nehéz a lekérdezés, ha a szűrési feltételek több sorban vannak

TIV · 2009. Okt. 28. (Sze), 14.07
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!
 
1

itt egy ötlet

gphilip · 2009. Okt. 28. (Sze), 18.05
Hali!

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!
2

Köszönet

TIV · 2009. Nov. 5. (Cs), 11.27
Köszönöm szépen, működik mint a csárm... :)
3

Örülök...

gphilip · 2009. Nov. 5. (Cs), 12.37
..hogy segÍthettem :)