ugrás a tartalomhoz

Kedvenc élelmiszerek kategóriánkénti SQL lekérdezése

moncsibe · 2007. Már. 28. (Sze), 08.25
Sziasztok!

A következő MySQL problémámmal fordulnék hozzátok:
Az élelmiszerek kategorizálva vannak: gyümölcsök, zöldségek, levelesek stb. Minden kategóriához tartozik egy vagy több élelmiszer: gyümölcs: alma, körte, szőlő stb. Az emberkék meg bejelölik, hogy melyik élelmiszert szeretik a legjobban (tehát nem kategóriát jelölnek be!): alma, tökfőzelék, palacsinta vagy rántotta, körte stb.

Mindehhez kellene egy keresőt írnom, amibe egy legördülő listából kiválasztja az emberünk a kategóriát, és megmondja neki a rendszer, hogy az adott kategóriához tartozó élelmiszereket ki szereti.

Ehhez a következő adatbázistáblák vannak:
Kategória: id, kategórianév
Élelmiszerek: id, élelmiszernév
Kat_élelmiszer: kategória_id, élelmiszer_id (ez mondja meg, hogy melyik kategóriához, mely élelmiszerek tartoznak)
Emberek: id, név, kedvenc_ételek

Talán a legutolsó tábla szorul magyarázatra. A kedvenc_ételek nevű oszlopban vesszővel elválasztva vannak az adott ember által bejelölt élelmiszerek, azaz pl. '6,12,8' vagy '12'. Sajnos ez a táblafelépítés adott, bár ha muszáj, akkor lehetne még egy táblát csinálni, hogy Kedvenc_ételek: ember_id, elelmiszer_id

Szerintetek ehhez hogyan lehetne a legegyszerűbben sql lekérdezést írni?
Én valami ilyesmire gondoltam, de ez nagyon csúnya szerintem :(
SELECT elelmiszer.id FROM kat_elelmiszer WHERE kategoria_id=2; --> ez visszaadja mondjuk 1, 2, 10-es idjű élelmiszereket.
SELECT emberek.nev FROM emberek WHERE 
kedvenc_etelek LIKE ('1') OR kedvenc_etelek LIKE ('1,%') OR kedvenc_etelek LIKE ('%,1,%') OR kedvenc_etelek LIKE ('%,1') 
OR kedvenc_etelek LIKE ('2') OR kedvenc_etelek LIKE ('2,%') OR kedvenc_etelek LIKE ('%,2,%') OR kedvenc_etelek LIKE ('%,2') 
OR kedvenc_etelek LIKE ('10') OR kedvenc_etelek LIKE ('10,%') OR kedvenc_etelek LIKE ('%,10,%') OR kedvenc_etelek LIKE ('%,10')
Ahogy látszik nekem a LIKE-os résszel vannak a gondjaim. Biztos meg lehet oldani másképp is. (Azért van egy azonosítóhoz ennyi LIKE, mert lehet a sztring elején, közepén, végén, illetve állhat magában is.)

Segítségeteket előre is köszönöm!

Moncsibe
 
1

SET adattípus

Gáldi Ákos · 2007. Már. 28. (Sze), 09.22
Nézz utána a SET adattípusnak a Mysql dokumentációjában, ha már ott vagy, ajánlom figyelmedbe FIND_IN_SET() fgvt.
3

SET adattípust hova?

moncsibe · 2007. Már. 28. (Sze), 10.44
Hova gondoltad a SET adattípust?
Ha a kedvenc élelmiszerek oszlophoz, akkor hogyan gondoltad beállítani a SET értékeit?
2

Kapcsolótábla

siposa · 2007. Már. 28. (Sze), 09.42
Mindenképpen az általad is említett kapcsolótáblára szavaznék, (ember_id, elelmiszer_id) oszlopokkal. Vagy az előbb említett SET, de azt nem ismerem. Csak így ne maradjon :)
4

Hasonlóan gondolkodsz

moncsibe · 2007. Már. 28. (Sze), 10.46
Háát igen, nekem is ez volt az első reakcióm, amikor megláttam ezt az adatbázisfelépítést ;)
Azt az előbb ugyanis nem írtam, hogy a táblák már adottak voltak, abból kellett / kellene kiindulnom.
5

kapcsolótábla, de van kis javítás is...

TeeCee · 2007. Már. 28. (Sze), 11.29
...
Ha hosszú távon ezt akarod továbbvinni, akkor írj egy scriptet, ami átrakja kapcsolótáblába!

Azért van egy azonosítóhoz ennyi LIKE, mert lehet a sztring elején, közepén, végén, illetve állhat magában is


Rakjál minden mező elé és mögé egy vesszőt...

kedvenc_etelek LIKE ('1') OR kedvenc_etelek LIKE ('1,%') OR kedvenc_etelek LIKE ('%,1,%') OR kedvenc_etelek LIKE ('%,1')


Így már csak ezt kell kérdezni:
kedvenc_etelek LIKE ('%,1,%')

Figyelj rá, hogy értékbeíráskor, móosításkor is rakjad a vesszőket, valamint az 'egyik sem' az LIKE (',,') lesz!

És még valami: A kedvenc_etelek mindenképpen legyen indexelve, különben meg be fog csinálni a mysql...

Üdv: TeeCee :o)