[ broker @ 22.04.2004. 16:30 ] @

Imate tabelu sa poljima ID, LANG, OPIS

Tabela sluzi za "prevodjenje" to jest za isti ID postoji vise slogova sa razlicitim LANG a za svaku vrednost LANG je definisan odgovarajuci OPIS.

Ulazni podaci su vrednosti ID, LANG, LANG_DEFAULT

Potrebno je napraviti upit koji ce iz tabele za dati ID i dati LANG vratiti odgovarajuci slog sa opisom ali ako ne postoji takav slog treba vratiti slog koji odgovara datom ID i datom LANG_DEFAULT.

Prevedeno na srpski: za ID vratiti slog koji daje opis na datom jeziku a ako nije definisan opis za taj jezik vratiti opis na nekom podrazumevanom jeziku.

Treba ovo resiti jednim SELECT upitom.

[ leka @ 22.04.2004. 17:11 ] @
Pretpostavljam iz tvog teksta da verujes da moze da se resi jednim SELECT upitom? Ja naiskrenije ne znam da li ovo moze jednim upitom da se resi...
[ noviKorisnik @ 22.04.2004. 17:36 ] @
Code:
SELECT description
FROM translator
WHERE id = '$id'
  AND lang IN ('$lang', '$lang_default')
ORDER BY lang DESC 
LIMIT 1

Ovo radi uz neke pretpostavke o polju lang. Ako je polje lang tipa ENUM i podrazumevani jezik je prvi u listi dozvoljenih vrednosti (ovakva postavka deluje i realno zadovoljavajuća za pretpostavljeni problem).
[ -zombie- @ 23.04.2004. 03:42 ] @
ovo radi bez ikakvih pretpostavki (eh, miline LEFT JOINa.. ;)

Code:
SELECT ifnull(sel.text, def.text) AS text
FROM trans AS def LEFT JOIN trans AS sel
ON sel.lang='$LANG' AND sel.id=def.id 
WHERE def.lang='$LANG_DEF' AND def.id='$ID'


sel je tabela za selektovani jezik, def za default. ostalo je valjda jasno..

// btw: ovo je za forum baze..
[ noviKorisnik @ 23.04.2004. 07:26 ] @
Dobar taj IFNULL() !!
[ broker @ 23.04.2004. 12:23 ] @
Zadovoljan sam da me je intuicija ipak dobro vodila :) Verovao sam da resenje postoji iako ga ja nisam video.

Resenje sa GROUP BY je ocigledno i moze jednostavnije od ponudjenog, medjutim, problem je sa pretpostavkom redosleda slogova a kao sto znamo kod SQL-a ne postoji nikakva garancija redosleda slogova ako ne postoji ORDER BY (a u ovom slucaju ne postoji nikakav nacin da se poredjaju jezici).

ifnull() sam takodje pokusavao da upotrebim ali na sasvim drugi nacin mada sam bio na dlaku od resenje ali sam bio corav.

Zombi ima 10 poena za dovitljivost :)

Nadam se da ce ovo biti od koriti, iako sam ga stavio samo kao mozgalicu.
[ bzero @ 23.04.2004. 12:56 ] @
Citat:
broker:
Resenje sa GROUP BY je ocigledno i moze jednostavnije od ponudjenog, medjutim, problem je sa pretpostavkom redosleda slogova a kao sto znamo kod SQL-a ne postoji nikakva garancija redosleda slogova ako ne postoji ORDER BY (a u ovom slucaju ne postoji nikakav nacin da se poredjaju jezici).


Moze malo da se sredi i ORDER BY, pa moze ovako:

Code:

SELECT IF(STRCMP(LANG, '$lang_default'),0,1) AS orderby, OPIS 
FROM tabela 
WHERE ID='$id' AND (LANG='$lang' OR LANG='$lang_default') 
ORDER BY orderby LIMIT 1

[ broker @ 24.04.2004. 09:31 ] @
Vrlo dovitljivo :)
[ leka @ 24.04.2004. 10:10 ] @
Bravo, ja nisam znao za IFNULL() takodje. Sada znam - zahvaljujuci majstorima. :)