Autor Zpráva
JaySee
Profil
Ahoj,

mám script, který vypisuje jídla do denního menu a celý návrh databáze je řešen jako vícejazyčný. Což mi přináší problém, když chci vypsat všechny pokrmy pro daný den v daném jazyce, ale co kdyby se stalo, že někdo nepřeloží daný pokrm do jiného jazyka? Chci proto nastavit, aby se v takovém případě vypsal název anglicky.

Pro výpis z databáze používám tento SQL:

SELECT 
                    
                    pl.nazev AS nazev,
                    pl.popis AS popis,
                    l.lang_desc AS langdesc
                    
                    
                    
                    FROM pokrm AS p
                    LEFT JOIN pokrm_lang AS pl
                    ON p.id = pl.id_pokrm
                    LEFT JOIN lang AS l 
                    ON pl.id_lang = l.id
                    
                    WHERE l.lang = '$lang'
                    
                    ;

A má představa je, že když nebude záznam v tabulce pokrm_lang existovat, použije se pokrm_lang s id_lang (řekněme 2 - to je angličtina).
Lze to udělat nějakou podmínkou uvnitř SQL? Nebo musím ověřovat existenci jazykového překladu před samotným selectem a pak podle toho vypisovat jinou jazykovou mutaci? Nepřipadne mi to jako schůdné řešení, protože chci, aby se v jiném jazyce vypsal třeba jen jeden řádek ze dvaceti.

Jestli někdo víte, jak na to, moc díky za náměty jak to řešit. Pokud na to nepřijdete, budu muset být restriktivní a žádat 100% vyplnění všech jazyků. (což by taky dávalo smysl)
Kajman
Profil
Teď si vůbec nejsem jístý tím zazávorkováním, ale možná něco takového
SELECT coalesce(pl.nazev, ple.nazev) AS nazev,
       coalesce(pl.popis, ple.popis) AS popis,
       coalesce(l.lang_desc, le.lang_desc) AS langdesc
FROM   pokrm AS p
LEFT   JOIN
       (pokrm_lang AS pl
       JOIN   lang AS l
       ON     pl.id_lang = l.id
              AND l.lang = '$lang')
ON p.id = pl.id_pokrm
LEFT   JOIN
       (pokrm_lang AS ple
       JOIN   lang AS le
       ON     ple.id_lang = le.id
              AND le.lang = 'en') 
ON p.id = ple.id_pokrm
JaySee
Profil
Kajman:
Díky za rychlou reakci, je to hodně dobrý, ale asi jsem se trochu špatně vyjádřil a tohle řešení funguje trochu jinak, než je potřeba. Zkoušel jsem to přepsat tak jak by to mělo být, ale dělá mi to ještě větší zvěrstva.

Takže pro upřesnění. Tabulky:
lang: |id|lang(cs/en/de/...)|lang_desc(čeština, angličtina, němčina)| - jen uchovává jazyky, které web podporuje
pokrm: |id|cena|druh|...| - uchovává všechny pokrmy
pokrm_lang: |id_pokrm|id_lang|nazev|popis|...| - drží jen jazykové mutace pokrmů (aby nedocházelo k duplicitám záznamů v databázi)

Takže jsem zkusel LEFT JOINnout znovu tabulku pokrm_lang a dát ji do coalesce, ale vypisuje mi to pak všechny pokrmy asi 6 krát...

Co z toho opravdu potřebuji dostat je jen ten popis a nazev ve správném jazyce.


Kajman:
Tak to už je asi lepší řešení, mám zatím testovací data, kde mám dva anglické překaldy a tři české.
U této poslední varianty se již cyklus provede 3 krát (tedy správně) ale u chybějícího překladu se nepoužije ten defaultní. Zkouším hledat, kde to upravit, aby to šlapalo, ale zatím marně.


Kajman:
Tak pozor, změna!! To poslední řešení je přesně to co hledám. Chyba je mezi mou židlí a klávesnicí. Zkopíroval jsem to tak jak to bylo a uplně zapomněl na mojí řídící proměnnou $lang_def...

Takže se omlouvám za zmatky a velice děkuji. Takhle si představuji dobře fungují více jazyčné řešení.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0