Kedvenc élelmiszerek kategóriánkénti SQL lekérdezése
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 :(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
■ 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')
Segítségeteket előre is köszönöm!
Moncsibe
SET adattípus
SET adattípust hova?
Ha a kedvenc élelmiszerek oszlophoz, akkor hogyan gondoltad beállítani a SET értékeit?
Kapcsolótábla
Hasonlóan gondolkodsz
Azt az előbb ugyanis nem írtam, hogy a táblák már adottak voltak, abból kellett / kellene kiindulnom.
kapcsolótábla, de van kis javítás is...
Ha hosszú távon ezt akarod továbbvinni, akkor írj egy scriptet, ami átrakja kapcsolótáblába!
Rakjál minden mező elé és mögé egy vesszőt...
Í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)