Mysql érték sorbarendezés valuta árfolyam váltással,feltételekkel
Sziasztok.
Nem kertelek,igazából valamiféle megoldást szeretnék,mert hogy hobby kódolóként bizony megakadtam.
van egy valuta árfolyamom aminek az értéke $eur["eur"]
. aztán van egy szép nagy adatbázisom lakásokról amiben az ingatlanok értéke lehet euro,vagy forint.
A lekérdezéskor ha a user mondjuk 500 Ft-ot ad meg akkor szépen ki tudok iratni minden ingatlant ami ebbe a keretbe belefér,akár euróbol átszámítva is forintra,és fordítva.
A problémám azzal van,mikor ezeket sorba szeretném rendezni (növekvő,illetve csökkenő).
Az adatbázisban a táblák értéke úgy van megadva hogy van egy ar mezőm,illetve egy ar_penznem (ami a valuta tipusát hivatott meghatározni) mezőm is.sokat bonyolódik a helyzet ha a lekérdezésben vannak feltételek (pl tól-ig ár)
Akkor így fest a kód:a probléma a sorbarendezéskor az,hogy nem veszi figyelembe a valuta nemét,és 0 499HUF valamint az 501HUF közé barakja az 500 EUR-t.
igazábóltudom ez így elég kevés infó,de a teljes forráskód igen hosszú,és nem biztos hogy örülnének ha bemásolnám.
természetesen ha kíváncsiak vagytok,megosztom a forráskódot is.
Segítségeteket előre is köszönöm.
■ Nem kertelek,igazából valamiféle megoldást szeretnék,mert hogy hobby kódolóként bizony megakadtam.
van egy valuta árfolyamom aminek az értéke $eur["eur"]
. aztán van egy szép nagy adatbázisom lakásokról amiben az ingatlanok értéke lehet euro,vagy forint.
A lekérdezéskor ha a user mondjuk 500 Ft-ot ad meg akkor szépen ki tudok iratni minden ingatlant ami ebbe a keretbe belefér,akár euróbol átszámítva is forintra,és fordítva.
A problémám azzal van,mikor ezeket sorba szeretném rendezni (növekvő,illetve csökkenő).
Az adatbázisban a táblák értéke úgy van megadva hogy van egy ar mezőm,illetve egy ar_penznem (ami a valuta tipusát hivatott meghatározni) mezőm is.
SELECT * FROM ( SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`,`tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM lakas_elado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` ,`terulet` , `feladva` , `modositva` , `statusz` FROM lakas_kiado UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM haz_kiado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM haz_elado UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM ker_kiado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` , `ar_penznem` ,`terulet` ,`feladva` , `modositva` , `statusz` FROM ker_elado )
AS U
Akkor így fest a kód:
SELECT * FROM ( SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`,`tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM lakas_elado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` ,`terulet` , `feladva` , `modositva` , `statusz` FROM lakas_kiado UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM haz_kiado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM haz_elado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` ,`ar_penznem` , `terulet` ,`feladva` , `modositva` , `statusz` FROM ker_kiado
UNION SELECT `id` ,`kat`, `user_id` ,`szerzodes` ,`szoba_sz`,`felszoba_sz`, `tul_name` , `tul_tel1` , `varos` , `kerulet` , `utca` , `hsz` , `ar` , `ar_penznem` ,`terulet` ,`feladva` , `modositva` , `statusz` FROM ker_elado )
AS U WHERE (U.ar >='0.66666666666667' AND U.ar_penznem='EUR' OR U.ar >='200' AND U.ar_penznem='HUF' )
AND( U.ar <='166.66666666667' AND U.ar_penznem='EUR' OR U.ar <='50000' AND U.ar_penznem='HUF') "
igazábóltudom ez így elég kevés infó,de a teljes forráskód igen hosszú,és nem biztos hogy örülnének ha bemásolnám.
természetesen ha kíváncsiak vagytok,megosztom a forráskódot is.
Segítségeteket előre is köszönöm.
Talán érdemes kiválasztani
Hát...
Az igaz, amit Gábor mond: kell alap deviza.
A két agyonbonyolított lekérdezés nem sokat mond, mindössze:
- Az adatbázis-szerkezet valószínűleg rossz;
- Sok ingatlan / sok látogató esetén belepistulsz az optimalizálásba;
- Kevered az adatbázist a fájlban - változóban tárolt értékekkel (ami nem mindig baj, de most igen).
Jobban örülök (de azt hiszem nem csak én) konkrét specifikációnak és adatbázistervnek. Az alapján jobban lehet segíteni, így tippelgetünk, ill. én találom ki az adatbázist - nem a legjobb út a megoldáshoz.
Azt hiszem, ha "valutázol", máris elfelejtheted azt, hogy változóban tárold az átváltást, több deviza is kell.
Viszont a termék árát a termék táblájában (mondjuk keglik) csak egy pénznemben tárolod, mondjuk HUF (gondolom Magyarországi a honlap / szolgáltatás). Legyen ez az oszlopnév is: HUF.
Kell egy deviza tábla (külön), ennek oszlopai: id, HUF, name.
Ebben a HUF oszlop valós szám, hogy a Ft-nál gyengébb valuták esetében is tudj osztót (<1) csinálni, feltétel: 0 nem lehet.
A lekérdezésbe külön be kell vinni (feltételesen generált oszlopérték az AR és a PENZNEM) a valutára számított árat. Úgy, hogy a keglik.HUF-al csak számolod a generált keglik.AR oszlopot, plusz kitöltöd a szintén generált keglik.PENZNEM-et a deviza.name-ből.
Megj.: valószínűleg én külön táblákba tenném a kiadó és az eladó, stb. ingatlanokat, mert más adatok-mértékegységek kellenek hozzájuk -> más tartalomtípusok.
Másik kérdés, hogy hogyan frissíted (naponta többször) a deviza táblát. Igazán profin úgy tudod, hogy keresel egy elfogadható oldalt (pl. MNB tájékán), amit cronjob-ból futtatva rendszeresen letöltesz (curl) és feldolgozol (DOM, DOMXML) és ez alapján frissíted a deviza táblát, mondjuk 2 óránként. A konkrét update tranzakcióba kell, és lockolni kell a táblát a végéig (pár msec, de ha közben jönne lekérdezés...).
Kevésbé profi megoldás, ha te kézzel, valami felületen írkálod.
Ami még fontos: minél egyszerűbb lekérdezéssel olyan komplett eredménytáblád legyen, amit PHP-ból már könnyedén dolgozol fel, hogy kimenetet gyárts belőle. Ne PHP-val számoltass, mert többnyire lassabb, mint a bármelyik SQL.
Esetleg a későbbiekben csinálhatsz mentett táblákat is, hogy az összes devizával legenerálod a teljes keglik tábla eredményét, ezt külön táblába mented, kéréskor meg az előregyártottból keresel, már sokkal egyszerűbb (és gyorsabb) lekérdezéssel.
Azt mindig tartsd szemelőtt, hogy ne haljon be az oldal azért, mert sok hirdetés és / vagy látogató van.
Szerk.: a deviza tábla plusz előnye, hogy a lekérdező formokban is abból tudod kitölteni a selectet, hogy milyen devizákkal lehet fizetni.