MySQL - SELECT több táblából, átlaggal
táblák (nem az összes mezővel, csak ami hirtelen kell)
borok (id, nev, pinceszet_id)
pinceszetek (id, nev, borvidek_id, telepules_id)
borvidekek (id, nev)
telepulesek (id, telepules)
ertekelt_borok (id, bor_id, ertek_szam)
ertekelt_pinceszetek (id, pinceszet_id, user_id, ertek_szam)
amiket vissza kellene kapnom:
- pinceszet id
- pinceszet nev
- borvidék név
- település név
- pincészet értékelések száma
és a komplikáció:
a pincészetek önálló értékelése mellett (ertekelt_pinceszetek) működik egy automatikus értékelés is.
ez azon alapul, hogy:
minden bort értékelhetnek (1-5-ig) a felhasználók (ertekelt_borok). így kialakul a borok átlagos értéke. ezeket kellene egy adott pincészet boraira megcsinálnom úgy, hogy a pincészet borainak egyenkénti átlaga alapján visszakapjak egy 1-5-ig terjedő pincészetre vonatkoztatott átlagot. tehát a pincészet megitélését a borainak a megitélése alapján.
Erre próbálok valami egymésba ágyazott SELECT-et csinálni, de egyelőre nem sikerül.
■ borok (id, nev, pinceszet_id)
pinceszetek (id, nev, borvidek_id, telepules_id)
borvidekek (id, nev)
telepulesek (id, telepules)
ertekelt_borok (id, bor_id, ertek_szam)
ertekelt_pinceszetek (id, pinceszet_id, user_id, ertek_szam)
amiket vissza kellene kapnom:
- pinceszet id
- pinceszet nev
- borvidék név
- település név
- pincészet értékelések száma
és a komplikáció:
a pincészetek önálló értékelése mellett (ertekelt_pinceszetek) működik egy automatikus értékelés is.
ez azon alapul, hogy:
minden bort értékelhetnek (1-5-ig) a felhasználók (ertekelt_borok). így kialakul a borok átlagos értéke. ezeket kellene egy adott pincészet boraira megcsinálnom úgy, hogy a pincészet borainak egyenkénti átlaga alapján visszakapjak egy 1-5-ig terjedő pincészetre vonatkoztatott átlagot. tehát a pincészet megitélését a borainak a megitélése alapján.
Erre próbálok valami egymésba ágyazott SELECT-et csinálni, de egyelőre nem sikerül.
Ha nem tervezed kifejteni a
Nem kell egymásba ágyazott SELECT
Nem lesz gyors. Nem tudsz súlyozni és valószínű nem érkezik annyi értékelés, mint amennyiszer meg kell ezt jeleníteni. Ezért én gondolkoznék egyéb más technológiák behozatalával ha ismernénk a feladat ezen részét.
Hajjaj
Hogy jött ki ez az érték?
Kis túlzással :)
5000 : pincénként 5 bor;
100000 : 5000 borra egyenként 20 értékelés.
Szerk.: a szorzás fejben történt, nem tudom, hogy jó-e :)
Nyilván te nem SELECT-eket ágyaztál egymásba, de a JOIN sem sokkal jobb (MySql-ben), ha jól tudom. És a GROUP BY az így létrejövő rekordhalmazon lesz, tehát előbb "legyártódik" a sok rekord. Pont erre céloztam, hogy az adatbázisszerkezet nem az igazi.
Ugye azt te sem gondolod,
Nemis
JOIN JOIN JOIN ...
. Motortól függ, mennyire jól optimalizálja, ill. az esetleges külső kulcsoktól, stb.Egy lekérdezésben?
Itt a táblastruktúra az, ami nem az igazi, de mivel ez csak az, "ami hirtelen kell", nemigazán tudok konkrétumot mondani. Nem derül ki a táblákból, hogy hol van egy bornak az átlagpontszáma. Sehol? Mert az jó lenne. (Az esetek többségében "olcsóbb" táblánként 1-2 plusz (szám) mező, mint jobbra-balra sok JOIN-t használni.)
Az a helyzet ezzel, hogy a
Aztán lehet a pincészetet is értékelni számokkal szöveges módon is.
Jelenleg:
ertekelt_borok (id, bor_id, user_id, ertek_szam, ertek_txt)
ertekelt_pinceszetek (id, pinceszet_id, user_id, ertek_szam, ertek_txt)
A lényeg, hogy ebben a listában úgy kell a pincészetnek értéket kijeleznem, hogy az ertekelt_borok táblából veszem az ő boraihoz tartozó egyéni értékeléseket és abból csinálok átlagot. Tehát gyakorlatilag a borai alapján ítélem meg.
Belegondolva lehet, hogy jobban járnék a pincészethez egy plusz mezővel, amit egy borához érkezett új értékelés esetén pontosítok. Ekkor ezt az átlagolást csak akkor kellene megcsinálnom és listázáskor csak lekérnem.
Gondolom ugyanez jó lenne a pincészet saját értékelésénél is.
Az mennyire volna jó megoldás, ha:
borok (id, nev, pinceszet_id, ertekeles)
pinceszetek (id, nev, ertekeles)
ertekelt_borok (id, user_id, bor_id)
ertekelt_borok_txt (id, bor_ertekeles_id, txt)
ertekelt_pinceszetek (id, user_id, pinceszet_id)
ertekelt_pinceszetek_txt (id, pince_ertekeles_id, txt)
Tehát a szöveges értékeléseket is külön táblába tenném, illetve a borok és pincék táblában tárolnám az átlagot.
Jobbnak néz ki
Az ertekelt_borok-nál és ertekelt_pinceszetek-nél most nincs pontszám (és máshol sem látom). És hiányoznak a korábbi cím, borvidék cuccok is.
Szerintem ülj le egy üres papírral és ceruzával a kezedben, nyugodtan gondold végig és rajzold (írd) le az összes táblát és relációt. (Én is így szoktam :))
Ha jól végiggondolod, most már menni fog.
Persze. Csak gyorsan
Szívesen
A lekérdezésre gondolsz? A
A szöveges értékelést azért akarom külön táblába tenni, mivel a számokkal történő értékelés mellé nem kötelező szövegeset is írni. Csak egy opció. Ha egy táblában lesz mindkettő, akkor a legtöbb helyen üresen fog állni csak.
És a táblákra
Attól még teheted egybe, ha mondjuk elfér (VAR)CHAR mezőben is, és nem kell indexelni, stb., így nem lesz lényegesen "nagyobb" az egy táblád, tehát lassabb sem. Viszont könnyebben kezelheted az egy Júzer - egy vélemény dolgot.
szerintem